gdb cheatsheet
1. gdb调试正在运行的某一进程 $ gdb attach PID $ break xxx $ continue (继续运行)
gdb调试某一可执行程序 $ gdb program $ break xxx $ run (运行程序)
gdb调试需要指定命令行参数的程序 $gdb --args a.out arg1 arg2 arg3
2. break func 设置断点(函数)
break file:line 设置断点 (文件:行号)
info breakpoints (info b) 查看断点
delete NUM 删除断点(断点Num)
disable NUM 去使能断点(断点Num)
enable Num 使能断点(断点Num)
disable 未指定断点Num,去使能所有断点
break 断点 if 条件
例子:
break 2997 if 0 == strcmp("segrt.xmlui", pcPluginName)
enable XXX
3. untile LINE (u LINE) 运行到某行
next 单行调试(不进入函数)
step 单步调试(进入函数)
4. print XXX (p XXX) 打印变量XXX
p/x XXX 十六进制打印变量XXX
display XXX 显示变量XXX(单步调试每一步都会打印此变量;删除时使用delete display NUM)
watch XXX 监控变量XXX(变量改变后,打印变量 新值+旧值;删除时使用delete NUM,用info break查看NUM)
set print pretty 使打印格式更可读
set print elements 300 设置打印长度 (例如:打印字符串时,字符串太长,无法打印全,可以使用此命令设置打印长度)
show print elements 显示打印长度
5. set var=VALUE 设置某变量的值
6. info threads 查看当前所有线程
thread NUM 切换到threaid = NUM的线程
7. backtrace (bt) 查看当前线程的调用栈
frame 编号 查看特定的栈帧
info locals 查看局部变量 (每一次函数调用会在栈上分配一个栈帧,函数的局部变量在特定的栈帧里)
8. set follow-fork-mode child 在调用fork之后,接着调试子进程
set follow-fork-mode parent 在调用fork之后,接着调试父进程(默认)
9. 某一个函数多个线程都会执行,使用gdb跟踪时,如何禁止gdb在线程之间进行切换?
set schedule-locking on (默认情况下为:set schedule-locking off)
10. x ADDRESS 查看内存地址中的值
11. gdb控制/屏蔽信号 (信号/异步事件)
info signals / info handle 查看所有信号的处理方式
handle signal keywrods...
Keywords:
nostop: 信号发生时,GDB不会停住被调试程序运行,但会打印消息告诉你接受到此信号
stop: 信号发生时,GDB停住被调试程序运行
print: 信号发生时,GDB会打印消息告诉你接收到此信号
noprint: 信号发生时,GDB不会打印消息告诉你接收到此信号
pass / noignore: 信号发生时,GDB将此信号交给被调试程序处理
nopass / ignore: 信号发生时,GDB不会将此信号交给被调试程序处理
Signal:
具体某一信号 SIGXXX
某一范围内信号 SIGXXX-SIGYYY
所有信号 all
(kill -s signal pid 发送信号signal到pid进程)