其它还可参考资料: 显示gdb版本信息 | 100个gdb小技巧
gdb使用技巧:
- 设置输入出不分页:
set pagination off 或者 set height 0
- 查看so的地址:
info sharedLibrary lib_ssmp
- 加载调试符号
add-symbol-flie /usr/lib/lib_test.dbg 0x0000007f19da1400 // 其中0x0000007f19da1400是对应so的起始内存地址
- gdb 启动可执行文件
./gdb filename
- 带参数启动程序
./gdb --args test.bin ./todir 或者 ./gdb test.bin然后set args ./todir
- 对文件某一行打断点 b test.c:100
- 对调用栈上一层的函数打断点:
先bt 查看调用栈, 再用 b 0x004461ec 基于地址打断点
- 条件断点
b func if $r0>5 // if不用打括号
- 对某个现成的某个函数打断点
b func thread 31
- 删除一个断点
d 6
- 删除全部断点
d
- 用call调用c++中不同类或者命令空间中的同名函数
先 b func 断住所有函数, 在用info b查看每个断点的信息,可以看到每个具体函数的地址,再使用函数地址来打断点b 0xb35c8a2c ,再删除多余的断点
- 对所有线程都执行命令:
thread apply all 加命令,如查看当前进程所有任务调用栈:thread apply all bt
- 断住后查看所有寄存器的值
info registers 简写 i r
- 断住后查看函数的入参
i r参看寄存器,$r0是第一个参数,注意C++类函数的第一个参数是this指针
- 查询全局变量的值
p g_var
- 查看所有全局变量和当前局部变量的值
info variables
- 查看内存,用二进制打印某个地址的内容
x &g_var 打印4字节
x/wx &g_var 打印4字节
x/4wx addr 打印 4 * 4 字节
x/16wx addr 打印16 * 4字节
- 断点断住后,查看调用了路径上面每个函数的入参:
用 f 3 切换到某一层调用, i r查看寄存器,r0是第一个参数,对于c++的类成员函数,r0是this指针
断住后,查看函数执行完成后出参的值
i r查看出参的地址,finish完成函数执行,p *0x8ecd4a3c 打印出参的值