这篇完全是给记性不好的我,属于个人备忘录。
gdb可是调试c/c++的利器,我经常使用的命令如下:
使用gdb
$ gdb 程序名称
$ gdb --args 程序名称 程序参数 //带参数启动
$ gdb -x /home/local/gdbinit --args 程序名称 程序参数 //带自定义gdbinit脚本启动
参数传递
set args 参数
注意不能是set args “参数” 。如果多个参数传递,添加了“ ”。会不被程序识别。或者启动直接添加参数
gdb --args 程序名称 程序参数
调试子进程
set follow-fork-mode child
断点设置
b test.cpp:12 //断在test文件的第12行
b *address //在某个地址处停下
b filename:line_num if (var == ??) //带条件的断点
i b //查看断点
d 1 // 删除断点,1为断点号
运行
r(run)
单行调试
单步 s (step 碰到函数会进入)
单行 n (next 碰到函数不会进行, 而是整条执行)
单步 si (单步执行汇编指令)
查看汇编指令
disassemble
x/10i $pc //从当前pc位置查看接下来的10条指令
查看寄存器信息
info registers
i r t0 at //仅仅查看t0和at两个寄存器中的值
查看变量值
p 变量名称
观察某个变量/内存地址的状态(也可以是表达式)
watchpoint只能在程序启动后设置,先在main那下个断点,让程序启动后暂停在main函数处:
(gdb) watch 变量名称
(gdb)c
调试多进程
(gdb) set follow-fork-mode child
(gdb) set detach-on-fork off
忽略某个信号
(gdb)handle SIG34 nostop noprint //忽略信号SIG34
也可以把此命令写入自己定义的gdbinit文件中,然后启动gdb时使用-x加载此gdbinit文件:
gdb -x /home/loongson/gdbinit --args 程序名称 参数列表
如何让程序能够使用gdb
使用gdb之前必须确保程序在gcc命令编译时添加 -g -rdynamic 选项。
当前很多应用编译是使用写好的Makefile。我们只要执行make命令就可以生成最终bin程序。那这个“-g -rdynamic”参数怎么添加进去呢?快速的方式是执行make时添加–trace参数。即make --trace 这样会把make过程的命令详细打印出来。然后找到gcc命令行,添加上“-g -rdynamic”参数后单独执行这条gcc语句,也可以生成bin程序。