注:下面介绍的命令,部分是全写,部分是简写。另外在编译时需要加上 -g 参数,以便生成调信息,这样调试时可以尽可能直观的查看到变量信息
1.info proc mappings
显示各个模块(可执行程序、动态库等)segment映射的虚拟内存地址列表
例:
2.info register
显示寄存器的值,可以配合反汇编分析crash
例:
(gdb) info register
rax 0xdbbb6a00007f719b -2613378610517544549
rbx 0x9e4b82c0 2655748800
rcx 0x3 3
rdx 0x0 0
rsi 0x7f719733b200 140125844779520
rdi 0xc27dcc00 3263024128
rbp 0x18d8fcf30 0x18d8fcf30
rsp 0x7f719733b2e0 0x7f719733b2e0
r8 0x15 21
r9 0xb0000 720896
r10 0x203000c 33751052
r11 0x0 0
r12 0x203a150 33792336
r13 0x63440000 1665400832
r14 0x7f719733b3d0 140125844779984
r15 0x7f71973430d4 140125844811988
rip 0x7f719baee1fe 0x7f719baee1fe <tang_cm::WebRtcFlowControl::HandleTimeout(long)+30>
eflags 0x10206 [ PF IF RF ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
3.layout asm
修改布局显示当前执行点前后的汇编代码,方便调试分析问题
例:
4.disas [地址]
反汇编:不加地址,则显示当前执行点函数的汇编代码;加地址,则可以显示该地址对应的汇编代码
例:
(gdb) disas
Dump of assembler code for function HandleEvent(long):
0x00007f719baee1e0 <+0>: push %rbx
0x00007f719baee1e1 <+1>: mov %rdi,%rbx
0x00007f719baee1e4 <+4>: mov 0x140(%rdi),%rdi
0x00007f719baee1eb <+11>: mov (%rdi),%rax
0x00007f719baee1ee <+14>: callq *0x38(%rax)
0x00007f719baee1f1 <+17>: mov 0x148(%rbx),%rdi
0x00007f719baee1f8 <+24>: mov (%rdi),%rax
0x00007f719baee1fb <+27>: callq *0x38(%rax)
=> 0x00007f719baee1fe <+30>: xor %eax,%eax
0x00007f719baee200 <+32>: pop %rbx
0x00007f719baee201 <+33>: retq
5.x /4xg [地址]
打印指定内存地址一定范围的值,/后面的4表示打印的个数,x表示16进制显示(d表示10进制整数显示,u表示10进制无符号整数显示),g表示以八字节来打印(b表示单字节,h表示双字节,w表示四字节)
例:
(gdb) x /4xg 0x000000008e08f920
0x8e08f920: 0x00000001b037e4dc 0xc000124e00000459
0x8e08f930: 0x0005b589ee4bbd84 0x0000000000000000
6.x /s [地址]
打印字符串
7.info locals
打印当前堆栈下的局部变量信息。这边需要注意的是,开启编译优化级别后,局部变量信息运行时可能会被优化导致无法正确显示。
8.bt
显示当前调用堆栈信息
例:
9.frame [数字]
切换当前的栈帧位置,使用bt命令打印出来的调用堆栈前面的 #数字 就是栈帧号,在调试时可以通过切换栈帧查看局部变量信息
10.info threads
显示当前所有运行的线程信息
11.t [数字]
切换到指定线程
12.thread apply all bt
一次性打印所有线程的调用堆栈