GDB的使用

本文详细介绍GDB调试器的基本操作及高级应用,包括启动、查看源代码、流程控制、数据显示格式、变量和内存查看、设置断点等关键功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.启动和退出GDB
 [root@localhost ~]#gdb test

启动GDB调试test程序

[root@localhost ~]# gdb programe 2146

启动GDB调试进程号为2146的进程


[root@localhost ~]# gdb

(gdb) attach 2146

启动GDB挂载到进程号为2146的进程上开始调试


(gdb) detach 2146

释放进程号为2146的进程,终止调试


(gdb)set args –a –b123 -c

(gdb)show args

设置和查看被调试程序的启动参数


(gdb)run

(gdb)kill

启动和停止当前被调试程序,run命令也可跟参数

(gdb)quit

终止调式,退出GDB


 2.查看源代码

(gdb)list 123

查看当前源代码文件中123行及其前后5行的代码

 

(gdb)list abc.cpp : 123

查看源文件abc.cpp中123行及其前后5行的代码

 

(gdb)list foo

查看函数foo起始行及其前后5行的代码

 

(gdb)list abc.cpp : foo

查看源文件abc.cpp中函数foo起始行及其前后5行的代码

 

(gdb)list 0xabcd1234

查看包含0xabcd1234地址的代码行及其前后5行的代码


3.流程控制 

(gdb)s

单步执行


(gdb)n

单步执行,但不展开函数调用


(gdb)c

继续执行


(gdb)u

执行至循环结束


(gdb)u 123

执行至123行


(gdb)finish

跳出当前函数


(gdb)bt

查看当前函数调用堆栈


(gdb)frame 3

跳转到函数堆栈中索引为3的函数上下文


4.GDB的数据显示格式

x 按十六进制显示

d 按十进制显示

u 显示32位无符号整型。

o 按八进制显示

t 按二进制显示

a 按地址显示

c 按字符显示

f 按浮点数显示

s 按字符串显示


5.查看变量和数组

(gdb)p foo

查看变量foo的值


(gdb)p *bar

查看指针bar所指对象内容


(gdb)p/x foo

按十六进制查看变量foo的值


(gdb)p bar@10

查看数组bar的10个元素


(gdb)ptype foo

查看foo的类型定义


6.查看内存内容

x命令格式:x/[count][format][size] address

size可以是b(byte), h(halfword), w(word), g(giant, 8 bytes)


(gdb)x/10ub ptr

按无符号整形从ptr所指地址开始输出10字节


(gdb)x/5xw ptr

按16进制从ptr所指地址开始输出5个字(10字节)


7.设置断点

(gdb)b 123

在当前源文件的123行设置断点


(gdb)b abc.cpp : 123

在源文件abc.cpp的123行设置断点


(gdb)b foo

在全局函数foo设置断点


(gdb)b foo::bar

在类foo的成员函数bar设置断点


(gdb)b ns::foo::bar

在命名空间ns中的类foo的成员函数bar设置断点


(gdb)b 123 if foo == 1 && bar == 0

在当前源文件123行设置断点,并且当foo等于1且bar等于0时才命中

 

7.管理断点

(gdb)info b

查看所有断点信息


(gdb)d

删除所有断点


(gdb)d 2

删除2号断点


(gdb)enable 1

打开1号断点


(gdb)disable 5

禁用5号断点


8.多线程

(gdb)info threads

查看线程表


(gdb)thread 2

切换到线程表中索引为2的线程


(gdb)b foo 2

在函数foo设置断点,并且只在索引为2的线程中命中


(gdb)set follow-fork-mode parent

当fork调用发生时,继续调试父进程


(gdb)set follow-fork-mode child

当fork调用发生时,继续调试子进程

转自:http://blog.sina.com.cn/s/blog_60bfd6400100eola.html

### GDB调试工具的使用指南 #### 启用GDB并设置调试环境 为了启用GDB调试器,需要先编译带有调试信息的程序。可以通过`gcc`命令添加`-g`选项来生成调试信息[^2]。例如: ```bash gcc -g program.c -o program ``` 随后可以启动GDB调试器,并加载目标程序: ```bash gdb ./program ``` 如果需要向被调试程序传递参数,则可以在运行时通过`run`命令指定这些参数[^1]: ```bash (gdb) run arg1 arg2 ``` #### 使用GDB命令进行调试 在GDB环境中,有多种命令可以帮助开发者查看程序的状态、控制执行流以及分析错误。 ##### 查看源码和状态信息 使用`list`命令可以查看当前文件中的源代码片段[^4]: ```bash (gdb) list ``` 此命令会显示当前上下文附近的代码行数,默认为10行。 ##### 断点管理 断点用于暂停程序以便进一步检查其行为。创建断点的方法如下: ```bash (gdb) break main ``` 这将在函数`main`入口处设置一个断点。还可以通过行号设置断点: ```bash (gdb) break filename.c:line_number ``` 删除特定编号的断点可通过以下方式实现: ```bash (gdb) delete breakpoint_number ``` ##### 单步执行 单步执行允许逐条语句跟踪程序逻辑。以下是常用的单步执行命令: - `step`: 进入子函数继续调试。 - `next`: 不进入子函数而跳过它。 - `continue`: 继续执行直到遇到下一个断点。 ##### 变量监控与表达式求值 利用`print`命令能够打印变量或表达式的值: ```bash (gdb) print variable_name ``` 对于复杂的数据结构或者指针内容,可能还需要借助格式化输出功能[^2]: ```bash (gdb) print/x address_value # 显示十六进制地址 ``` #### 分析Core Dump文件 当应用程序异常终止时可能会生成core dump文件。要使用GDB对此类文件进行分析,需按照下面的方式操作[^3]: ```bash gdb executable_file core_dump_file ``` 之后即可像正常调试一样探索崩溃时刻的信息,比如回溯调用链(`bt`)、检视寄存器状态等。 --- ### 常见GDB命令总结表 | 功能 | 对应命令 | |---------------------|------------------------------| | 开始调试 | gdb target_program | | 执行程序 | (gdb) run | | 列出源代码 | (gdb) list | | 设置断点 | (gdb) break function_or_line| | 删除断点 | (gdb) delete breakpoint_num | | 步骤前进(不进入函数)| (gdb) next | | 步骤前进(进入函数内部)|(gdb) step | | 继续执行到下一断点 | (gdb) continue | | 打印变量 | (gdb) print varname | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值