GDB使用

 
1、启动程序

在命令行下输入" gdb ",可直接进入gdb调试程序。然后通过" file <目标程序> "可以将所要调试的程序加载到gdb中。

在命令换下输入" gdb <目标文件> "可直接启动gdb并加载目标文件。

2、设置断点

设置断点是调试程序的重要手段。程序会在断点处停止执行,然后开发人员就可以检查当前程序运行的上下文信息,或是进行单步执行。

break function 在某个函数入口处设置断点

break filename:function 考虑到有可能存在同名的函数,可以再附加上文件名作为标识

break linenum 在当前文件的第linenum行设置断点

break filename:linenum 在指定文件的第linenum行设置断点

break ... if cond 当指定的条件满足时才会在断点处停止

info breakpoint 显示当前设置的断点的信息

clear 清除所有断点

delete breakpoint num 每个断点都有一个编号,可以使用info breakpoint查看。该命令用于删除断点号为num的断点

3、执行程序

当程序支行到断点停下来时,就可以借助于执行命令按照期望的方式驱动程序运行了。

run 驱动程序开始运行,该命令一般是在装载了可执行文件后,开始运行时所致行的命令。如果程序有命令行参数,可直接附加在run后面,例< run -c -f >

next 执行下一条语句,子程序调用作为一步执行,不会进入到子程序内部

step 单步执行,遇到子程序调用时,会进入到子程序内部

finish 执行完当前子程序。当进入子程序调试完毕之后,可使用finish跳出该子程序

continue 继续运行,直到程序结束或是遇到断点

4、查看信息

gdb对于调试的最重要的功能就是可以查看程序运行的上下文信息,在这方面为开发人员提供了丰富的命令。

print 打印出程序上下文的信息。具体可以是变量的值<print a>、子程序运行的结果<print add(a,b)>或是其它的有意义的组合。详细功能可自行挖掘。

display 显示出程序上下文的信息。与print功能基本相似,只是在每次程序停下来后都会自动打印出信息,方便在单步调试时对变量的追踪,不必每次都用print进行打印。

bt 显示程序运行的栈信息。

注意:gdb只能显示全局变量和当前栈内的局部变量的信息。在打印变量信息时如果提示找不到该变量,需要检查该变量是否在当前断点的上下文内。

5、连接进程

有时候程序不是在gdb中启动的也想对它进行调试,这时就可以首先启动gdb,然后使用attach命令连接到该进程上去,就可以进行调试了。

attach pid 将gdb连接到进程号为pid的进程上去,连接上去之后,该进程会停止执行。

detach 调试结束之后,可以使用该命令取消连接,程序继续运行。

注:连接进程需要知道进程号,可以使用ps -aux 来查看。如果要连接线程,可以使用ps -eLm来查看

6、对多线程的支持

使用info threads可以查看运行的线程

切换线程:使用 thread THREADNUMBER 进行切换,THREADNUMBER 为线程号

### 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、付费专栏及课程。

余额充值