Linux的GDB学习与入门

news2024/11/25 0:38:47

GDB

  • GDB(GNU Debugger)是一个功能强大的调试工具,广泛用于调试 C、C++ 和其他编程语言编写的程序。它是 GNU 项目的一部分,专为帮助开发者在程序执行时检测和修复错误设计。GDB 能够控制程序的执行,查看程序内部的状态,帮助定位代码中的问题,并提供详细的信息以供开发者分析。

主要功能

  • 设置断点:你可以在代码的特定行、特定函数或满足条件时设置断点,程序运行时会在断点处暂停。
  • 单步执行:逐行执行代码,方便查看每行代码执行后的状态。
  • 查看变量和内存:可以查看当前程序的变量值、内存内容,甚至修改它们。
  • 分析程序崩溃:通过分析程序崩溃时的核心转储文件,帮助开发者找到崩溃的根本原因。
  • 跟踪调用堆栈:能够查看函数调用栈,帮助分析程序执行的路径。

GDB 的工作流程

GDB 的调试过程主要包括以下几个步骤

  1. 编译程序:要使用 GDB 调试,首先需要在编译时添加 -g 选项,这样会生成包含调试信息的可执行文件。
  2. 启动 GDB:通过 gdb 启动调试,并加载需要调试的程序。
  3. 设置断点:在程序中指定某些行或函数设置断点,方便在特定位置停止程序。
  4. 运行程序:在 GDB 中运行程序,程序会在断点处停止。
  5. 查看状态:在停止的地方可以检查变量、查看内存、打印调用栈等。
  6. 单步调试:通过逐行或逐步执行代码,追踪程序的运行流程。
  7. 继续执行:在检查完状态后,继续执行程序,直到下一个断点或程序结束。

使用步骤

  1. 编译程序时添加调试信息
    要调试的程序需要包含调试信息。这是通过在编译时添加 -g 选项来实现的。例如,如果你有一个 C 语言源文件 main.c,你可以用以下命令编译它
gcc -g -o my_program main.c
  1. 启动 GDB
    启动 GDB 并加载你想调试的程序
gdb ./my_program

启动后,你将进入 GDB 的调试界面,可以使用 GDB 提供的各种命令进行调试。

  1. GDB调试命令大全表
命令说明
gdb program启动 GDB 并调试指定的可执行文件
runr开始执行程序
continuec继续执行程序直到下一个断点
breakb在指定位置设置断点,如:break mainb 10 (在第10行设置断点)
steps单步执行代码(进入函数内部)
nextn单步执行代码(跳过函数调用)
finish执行当前函数直到返回
backtracebt显示调用栈
printp打印变量的值,如:print x
info locals查看当前栈帧的局部变量
info args查看当前函数的参数
set var设置变量的值,如:set var x=10
display在每次停止时自动显示变量的值,如:display x
undisplay停止自动显示某个变量的值
listl显示源代码,如:listlist 10 显示从第10行开始的代码
info break显示所有断点信息
deleted删除断点,如:delete 1 删除第一个断点
info functions显示所有函数名
info variables显示所有全局变量
info threads显示当前所有线程
threadt切换到指定线程,如:thread 2
thread apply all对所有线程执行命令,如:thread apply all bt 显示所有线程的调用栈
watch设置变量的观察点,当变量值变化时暂停程序执行,如:watch x
rwatch设置读取观察点,程序读取某个变量时暂停,如:rwatch x
awatch设置访问观察点,程序访问某个变量时暂停,如:awatch x
info watchpoints显示所有观察点
info source显示当前调试的源文件信息
info registers显示当前 CPU 寄存器的值
framef切换到指定的栈帧,如:frame 2
x查看内存地址的内容,如:x/x 0xaddress 以十六进制显示指定地址的内容
ptype显示变量的类型,如:ptype x
stepisi逐指令执行
nextini逐指令跳过函数调用
info sharedlibrary显示加载的共享库信息
clear清除某行或某函数的断点,如:clear 10 清除第10行的断点
enable启用断点
disable禁用断点
x/10i以指令格式显示10条从指定地址开始的内容,如:x/10i $pc
start启动程序,并在 main() 函数处停止
info files显示加载的符号文件及其内存地址
detach从当前进程分离,不停止进程
quitq退出 GDB 调试

一些高级功能

  1. 断点管理
  • 条件断点:让断点只有在满足某个条件时才会触发。
    break <line_number> if <condition>
    
  • 断点命令:可以在断点处自动执行某些命令。
break 30 # 在源代码的第 30 行设置一个断点。程序在执行到这行代码时将暂停。
commands 1#这个命令定义了在断点 1(即刚才设置的断点)处触发时要自动执行的命令序列。
print x # 命令用于打印变量 x 的当前值
continue # 这是告诉 GDB 继续执行程序的命令,直到遇到下一个断点或程序结束。
end #这是命令序列的结束标志,表示在断点 1 处应执行的命令已经定义完毕。
  • 临时断点:只触发一次后自动删除
tbreak <line_number>
tbreak 20 #只在第 20 行触发一次。
  • 禁用/启用断点
disable <breakpoint_number>
enable <breakpoint_number>
  1. 观察点和监视点(其实就是运行到它们变化时会停下来,并报告变化)
  • 观察点(Watchpoint):监控内存位置或变量的变化,每次改变时会停止程序。
watch <variable>
#watch x 会在变量 x 的值改变时停止程序。

在这里插入图片描述

  • 读写监视:监视特定内存地址的读取或写入操作
rwatch <variable>   # 监视读取
awatch <variable>   # 监视读取和写入
  1. 堆栈调试
  • 查看调用栈
backtrace  # 或 bt
  • 切换栈帧
frame <frame_number>
  • 查看指定帧的局部变量
info locals
  • 查看函数参数
info args

在这里插入图片描述

  1. 内存调试
    • 查看内存内容
    x/<format> <address>
    	<format> 表示显示格式,包括显示的单位(如字节、字)、数量以及显示类型(如十六进制、十进制)
    显示类型
    	x:以十六进制显示
    	d:以十进制显示
    	c:以字符形式显示
    	s:以字符串形式显示
    	f:以浮点数显示
    数量单位
    	b:字节(byte)
    	h:半字(halfword)
    	w:字(word,通常为 4 字节)
    
    例如:查看 0x600000 地址的 4 个字的十六进制内容
    x/4xw 0x600000
    
    • 修改内存内容
      1. 使用 set 命令来修改变量或内存的值。
    set <variable> = <value>
    set x = 100 #修改变量 x 的值
    
     2. 修改内存地址的值
     如果你知道某个地址并想修改该地址处的值,可以通过 *(type *)<address> 访问内存并设置值	
    
    set *(int *)0x600000 = 42 #地址 0x600000 处的值修改为 42(以整数形式)	
    

在这里插入图片描述

  1. 线程调试
(gdb) info threads
(gdb) thread 2 #假设我们想调试线程 2,可以使用以下命令切换到线程 2
(gdb) backtrace #可以使用 backtrace 命令查看该线程的调用栈
  1. 脚本化调试
  • GDB允许你使用脚本来自动化调试任务,这可以减少重复操作,提高效率。
    GDB 命令脚本:你可以将一系列GDB命令写入文件,然后通过source命令来加载执行。例如,将常用的断点设置或打印命令放入一个文件,然后每次启动GDB时执行它。
# example.gdb
break main
run
backtrace

使用
(gdb)source example.gdb
  1. 反向调试
    GDB 支持反向调试,这是一个非常强大的特性,允许你回到程序的某个状态,查看之前的变量值,定位问题的根源。常用命令如下:
    • reverse-continue:反向继续执行,直到遇到断点。
    • reverse-step:反向执行一步,进入函数。
    • reverse-next:反向执行一步,跳过函数。
      反向调试对于追踪难以重现的错误,特别是并发性错误或随机出现的崩溃非常有用。
  2. 远程调试
    GDB 支持远程调试,你可以通过网络连接到远程设备进行调试(如嵌入式设备或容器中的应用)。
    • 嵌入式开发
    • 远程调试
    • 调试没有本地调试环境的系统
  • GDB服务器模式:在目标设备上启动GDB的服务器模式。
    gdbserver :1234 ./my_program
    # gdbserver:这个命令启动 gdbserver,它允许程序在远程主机上运行,并通过网络与本地主机上的 GDB 连接,GDB 可以控制和调试该程序。
    # :1234:表示 gdbserver 监听的端口号,1234 是一个 TCP 端口。
    # ./my_program:这是你要调试的程序的路径。
    
  • GDB客户端连接:在本地使用GDB连接到远程设备上的GDB服务。
gdb ./my_program
target remote <remote_ip>:1234
#  <remote_ip> 是运行 gdbserver 的远程主机的 IP 地址
# 1234 是 gdbserver 监听的端口。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2211701.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024诺奖引发思考,AI究竟是泡沫还是未来?

你好&#xff0c;我是三桥君 现在的AI技术发展得非常快&#xff0c;特别是深度学习和大模型这些技术&#xff0c;感觉和以前那些最后没搞成的技术泡沫不一样。 现在AI有超级强大的计算能力&#xff0c;还有大量的数据可以用来训练&#xff0c;算法也越来越厉害&#xff0c;能搞…

【单机游戏】【烛火地牢2:猫咪的诅咒】烛火地牢2:猫咪的诅咒介绍

《烛火地牢2&#xff1a;猫咪的诅咒》是一款将Roguelike与2D横版动作融为一体的独立游戏&#xff0c;由新西兰制作人Chris McFarland耗费3年时间精心制作。玩家将闯入不同的关卡接受挑战&#xff0c;通关要求是寻找每个关卡中的钥匙。在闯关时玩家能获得武器&#xff0c;防具&a…

关于int*的*号归属权问题

再根据函数指针定义&#xff1a;int (*int) (int a)。我们发现*和后面的标识符才是一体的 所以int *a,b;的写法更好&#xff0c;说明a是指针类型&#xff0c;b是int类型

让Kimi像人类思考的“Kimi探索版“已开启灰度内测!GPT-o1贡献者之一宣布离职|AI日报

文章推荐 “AI教父”辛顿与物理学家霍普菲尔德荣获诺贝尔物理学奖&#xff01;“AI教母”李飞飞选择谷歌云作为主要计算提供商&#xff5c;AI日报 今日热点 o1推理模型贡献者Luke Metz官宣从OpenAI离职 就在昨日&#xff0c;o1推理模型贡献者之一Luke Metz发文称自己经过两…

Ofcms-(java代码审计学习)

1、背景 根据《java代码审计实战》学习进行记录&#xff0c;java代码审计CMS实战。 2、Ofcms下载 可搜索Ofcms1.1.2版本进行下载。下载连接&#xff1a;ofcms: java 版CMS系统、基于java技术研发的内容管理系统、功能&#xff1a;栏目模板自定义、内容模型自定义、多个站点管…

五、UI弹窗提示

一、制作弹窗UI 二、创建脚本 1、继承WindowRoot&#xff08;UI基类&#xff09; 获取UI上面的组件 2、初始化 将这个文本失活 3、写一个提示出现的方法 这个派生类中&#xff0c;继承了基类的两个方法&#xff0c;设置显示和设置文本 对应基类的这两个方法 将动画赋值给动…

DDPM - Denoising Diffusion Probabilistic Models 扩散模型

DDPM - Denoising Diffusion Probabilistic Models 扩散模型 扩散模型概述 扩散模型是在模拟图像加噪的逆向过程。也就是在实现一个去噪的过程。简单的来说就包括两个过程组成 前向的扩散过程 Forward Diffusion Process反向扩散过程 Reverse Diffusion Process 下面我们对整个…

流域生态系统服务评价、水文水生态分析、碳收支、气候变化影响、制图等领域中的应用

流域生态系统服务评价、水文水生态分析、碳收支、气候变化影响、制图等领域中的应用 专题一、生态系统服务评价技术框架 1.1 生态系统服务概述 1.2 流域生态系统服务的分类与作用 1.3 生态系统服务评估方法 专题二、AI大模型与生态系统服务评价 2.1 目前常用大模型介绍 2…

Java并发 - AQS之ReentrantLock

文章目录 ReentrantLockAQS 队列AbstractOwnableSynchronizerAbstractQueuedSynchronizerNodewaitStatusSHARED/EXCLUSIVE 模式 加锁流程尝试加锁 tryAcquire加锁失败入队addWaiterenq 阻塞等待 acquireQueuedparkAndCheckInterrupt 放弃加锁 cancelAcquire唤醒阻塞线程 unpark…

大语言模型训练

大语言模型训练 1.两大问题2.并行训练2.1数据并行2.2模型并行2.3张量并行2.4混合并行 3.权重计算3.1浮点数3.2混合精度训练3.3deepspeed&#xff08;微软&#xff09;3.3.1 ZeRO3.3.2ZeRO-offload 3.3总结 4.PEFT4.1Prompt TuningPrefix-tuning4.2P-tuning & P-tuning v2 5…

arcpy总结

arcpy 一、是什么二、为什么三、怎么用1、在哪里打开2、基础术语3、代码组织4、案例&#xff08;1&#xff09;裁剪&#xff08;2&#xff09;土地变化特征分析&#xff08;4&#xff09;文件访问与检测&#xff08;5&#xff09;空间数据的查询、插入与更新&#xff08;6&…

伯努利分布(Bernoulli distribution)的两次成功之间间隔次数的分布

伯努利分布&#xff08;Bernoulli distribution&#xff09;是一种特殊的二项式分布&#xff0c;即0-1分布。百科上已经说明了这种分布&#xff0c;即&#xff0c;其中。其数学期望为&#xff0c;方差为。详细说明见0—1分布_百度百科 本文进一步说明对于这类分布的事件&#…

BUUCTF-greatescape1

发现有ftp包和tcp包居多 下载解压是个流量包&#xff0c;使用wiresharh打开&#xff0c;CTRLF&#xff0c;按下图搜索ftp tcp18流发现ssc.key 传送&#xff0c;在19流发现key内容 复制保存为ssc.key, 加载key解密tls&#xff0c;再追踪tls流可得flag INS{OkThatWasWay2Easy} …

微知-Bluefield DPU使用flint烧录固件报错MFE_NO_FLASH_DETECTED是什么?MFE是什么?

文章目录 背景一些报错场景MFE是什么&#xff1f;有哪些MFE 背景 在DPU的fw操作flint的时候&#xff0c;很多命令都会报这个错误&#xff1a;MFE_NO_FLASH_DETECTED&#xff0c;早期很疑惑并且猜测MFE是Mellanox Firmware Engine。实际并不是&#xff0c;具体还得走到mellanox…

linux 中mysql my.cnf 配置模版

前置准备 sudo systemctl stop mysqld 注意&#xff1a; 原本配置重命名做备份 备份数据 删文件 直接新建 my.cnf 把配置 11要粘进去的内容 直接粘进去 注意&#xff1a;尽管log-bin 和 log_bin 都可以启用二进制日志&#xff0c;但为了保持与现代MySQL版本的兼容性和一…

【算法系列-哈希表】两数之和(Map)

【算法系列-哈希表】两数之和 (Map) 文章目录 【算法系列-哈希表】两数之和 (Map)1. 两数之和(LeetCode 1, 梦开始的地方)1.1 思路分析&#x1f3af;1.2 解题过程&#x1f3ac;1.3 代码示例&#x1f330; 2. 四数相加II(LeetCode 454)2.1 思路分析&#x1f3af;2.2 解题过程&am…

MySQL-08.DDL-表结构操作-创建-案例

一.MySQL创建表的方式 1.首先根据需求文档定义出原型字段&#xff0c;即从需求文档中可以直接设计出来的字段 2.再在原型字段的基础上加上一些基础字段&#xff0c;构成整个表结构的设计 我们采用基于图形化界面的方式来创建表结构 二.案例 原型字段 各字段设计如下&…

rsync 数据镜像同步服务笔记

1. rsync概述 定义&#xff1a;rsync是一款数据镜像备份工具&#xff0c;支持快速完全备份和增量备份&#xff0c;支持本地复制与远程同步。镜像指两份完全相同的数据备份.特点&#xff1a; 支持整个目录树和文件系统的更新&#xff1b;可选择性地保留符号链接、文件属性、权限…

【Orange Pi 5嵌入式应用编程】-BMP280传感器驱动

BMP280传感器驱动 文章目录 BMP280传感器驱动1、BMP280传感器介绍2、BMP280的测量流程2.1 气压测量2.2 温度测量2.3 IIR滤波2.4 滤波器选择2.5 噪声3、BMP280的功耗模式3.1 休眠模式3.2 强制模式3.3 正常模式3.4 模式转换4、数据读取及计算4.1 寄存器数据覆盖4.2 输出补偿4.3 补…

一键生成证件照的开源利器:HivisionIDPhotos使用教程

HivisionIDPhotos使用教程&#xff1a;一键生成证件照的开源利器 HivisionIDPhotos 是一款开源的、轻量级且高效的AI工具&#xff0c;专注于证件照的自动生成。通过这一工具&#xff0c;用户只需上传一张自拍或其他照片&#xff0c;便能快速生成标准尺寸的证件照&#xff0c;免…