gdb常用命令
加载core
gdb oSan core.XXXX
调试带命令行参数程序
gdb --args ./prog arg1 arg2
使用源代码对照调试窗口
在有源代码的环境下,在gdb调试状态,使用ctrl + X,A可以切换到源代码对照调试窗口。
此时会分上下屏显示源代码和命令窗口,使用以下命令可以将设置当前键盘操作窗口:
(gdb) focus src
(gdb) focus cmd
冻结当前线程之外其它线程
在多线调试环境时,有时为了单步调试时,避免被其它线程打断,可以冻结其它线程:
(gdb) set scheduler-locking on
解冻其它线程:
(gdb) set scheduler-locking off
数据断点
为了跟踪某块内存在是哪里被修改了,可以设置数据断点,例如,假设希望在0x12345678这个4字节的内存区域在被修改时中断,可以:
(gdb) watch *(int*)0x12345678
那么,当上述4字节内存区域被修改时,触发中断。
条件断点
当指定的条件满足时break。例如,假设希望osan_lpc_submit_io函数在满足p_io->lunset_id为0时中断:
(gdb) b osan_lpc_submit_io if p_io->lunset_id==0
格式化显示
按十六进制打印变量val:
(gdb) p/x val
打印数组多个元素的值:
(gdb) p *array@len
按二进制打印变量val:
(gdb) p/t val
格式化打印结构体:
(gdb) set print pretty on
反汇编
(gdb) set disassembly-flavor intel # 使用intel格式,默认为AT&T格式。
(gdb) disassemble main # 反汇编
(gdb) disassemble /m main # 反汇编与源码对照
gdb启动时执行调试命令
例如,gdb启动时给main函数打断点“b main”:
gdb ./test -ex "b main"
gdb启动时执行调试命令脚本
假设有一个脚本文件~/my_gdb,内容如下:
b main
b start_fun
r
gdb启动时执行该脚本
gdb ./test -e ~/my_gdb
gdbinit(gdb初始化脚本)
分三个级别:
/etc/gdbinit:
System-wide initialization file. It is executed unless user specified GDB option "-nx" or "-n".
~/.gdbinit:
User initialization file. It is executed unless user specified GDB options "-nx", "-n" or "-nh".
./.gdbinit:
Initialization file for current directory.
gdbinit应用举例
set scheduler-locking on和set scheduler-locking off这样的gdb指令有点长,如果经常使用不太方便,我们可定义一个短一点的命令替代之。
编辑~/.gdbinit文件,增加内容:
def lkon
set scheduler-locking on
end
def lkoff
set scheduler-locking off
end
这样以后就可以使用lkon和lkoff代替前面的长命令了。
查看所用线程堆栈信息
(gdb) thread apply all bt
结果输出到文件
(gdb) set logging file <file name>
(gdb) set logging on
(gdb) 。。。。。。
(gdb) set logging off
gdb非交互式
gdb -q --batch --ex "set height 0" --ex "bt" [core] [exe]
不分页
(gdb) set height 0
打印长文本
(gdb) set print elements 0
(gdb) show print elements
Dump内存区到文件:
(gdb) dump binary memory <文件名> 内存起始地址 内存结束地址
捕捉异常
gdb> catch throw
catch catch
当异常抛出时中断。
加速gdb调试so时的加载速度
如果gdb index很大,那么gdb调试时,load时间会很长,那么可以在编译时使用以下命令,把gdb index追加到.so文件,这样在gdb调试时,减少了index计算时间。
gdb-add-index libtest.so
strip
去除release版本程序的符号库。
strip sql/mysqld