1. 帮助
选项 |
作用 |
help |
列出所有命令分类 |
help class |
列出分类class中的命令列表 |
help command |
显示命令command的使用说明 |
2. 启动
选项 |
作用 |
gdb program |
开始调试program |
gdb -command=c program |
开始调试progream,c是本项目的启动文件 |
gdb program core |
调试program,core作为credump文件 |
- 加载程序时,gdb尝试加载启动文件。有两个启动文件,一个是~/.gitinit,属于当前用户,另一个属于特定项目,用-command选项指定。
- ~/.gitinit是在加载程序前加载的,适合一般用途;-command指定的启动文件是在加载程序后加载的,所以特定于项目,如设置断点等。
3. 运行程序
选项 |
作用 |
run arglist |
设置参数列表为arglist,并运行程序 |
run |
用当前的参数列表运行程序 |
set args [arglist] |
设置参数列表为arglist。如果没指定arglist,则清空参数列表 |
show args |
显示当前参数列表 |
run ... <inf >outf |
输入、输出分别重定向到inf,outf |
kill |
杀死运行中的程序 |
set env var string |
设置环境变量var的值为string |
show env |
列出所有环境变量 |
show env var |
列出环境变量var的值 |
unset env var |
删除环境变量var |
4. 调试目标
选项 |
作用 |
target type targ |
连接到指定类型typed的目标targ,如远程机器 |
attach process |
挂接到指定进程 |
detach |
脱离(放弃控制)当前进程 |
5. 工作文件
选项 |
作用 |
info sharedlib |
列出当前加载的动态库 |
6. 符号表
选项 |
作用 |
info address s |
显示符号s的地址 |
info func reg |
显示函数reg的原型。regexpr是正则表达式 |
info var reg |
显示全局变量reg的定义 |
whatis expr |
显示expr的类型。expr可以是变量或类型 |
ptype expr |
显示expr的类型。信息比whatis更详细 |
7. Shell命令
选项 |
作用 |
cd dir |
工作目录改成dir |
pwd |
显示工作目录 |
make |
调用make |
shell cmd |
运行Shell命令cmd |
8. 断点 breakpoint、监视点 watchpoint
选项 |
作用 |
break [file:] line |
在文件file、行line设置断点。b等同于break。 |
break [file:] function |
在文件file、函数function设置断点 |
break ... if expr |
设置条件断点,如果expr非0,则停止 |
cond n [expr] |
给断点n设置条件,如果没指定expr,则清除条件。 |
commands n |
给断点n设置命令列表。 |
tbreak ... |
设置临时断点,一次有效 |
info break |
显示所有断点 |
clear [file:] line |
清除文件file、行line的断点。 |
clear [file:] function |
清除文件file、函数function的断点 |
delete [n] |
删除断点n。如果没指定n,清除所有断点。 |
disable [n] |
禁用断点n。如果没指定n,禁用所有断点。 |
enable [n] |
启用断点n。如果没指定n,启用所有断点。 |
watch expr |
设置监视点,如果expr变化,则停止 |
info watch |
显示所有监视点 |
(gdb) info breakpoints
Num Type Disp Enb Address What
1 breakpoint keep y 0x000000000040087b in main(int, char**) at /home/ron/dev/cmake/demo/main.cpp:24
2 hw watchpoint keep y xyz
Num: 编号
Type: 类型。可以是breakpoint、watchpoint、或catchpoint。
Disp: 部署Disposition,指出gdb下次暂停时怎样处理该断点。可以是keep(保持),del(删除) 或dis(禁用)。
Enb: 当前,可以是y(启用)或n(禁用)。
Address: breakpoint在内存中的位置。watchpoint这项为空。
What: breakpoint在源代码中的位置。watchpoint这项是变量或表达式名。
(gdb) break 21 if x == 0
(gdb) info break
7 breakpoint keep y 0x00000000004007f6 in main(int, char**) at /home/ron/dev/cmake/demo/main.cpp:21
stop only if x == 0
(gdb) cond 7 x < 3
break 21 if test_var(x)
也可以包含库函数,如:
break 21 if strlen(mystring) > 1
(gdb) commands 2
Type commands for breakpoint(s) 2, one per line.
End with a line saying just "end".
>silent
>printf "x is %d.\n", x
>end
(gdb) info b
Num Type Disp Enb Address What
2 breakpoint keep y 0x00000000004008c9 in main(int, char**) at /home/ron/dev/cmake/demo/main.cpp:33
breakpoint already hit 2 times
silent
printf "x is %d.\n", x
- 监视点结合了断点和变量检查的概念。基本的形式是: 当变量值发生变化时,暂停程序执行。
(gdb) watch z
更好的方法是指定条件表达式。如下的形式是:当z的值第一次大于28时,暂停执行。
(gdb) watch (z>28)
- 监视点指定的变量要处于作用域内。一旦离开作用域,监视点被删除。
9. 浏览栈帧
选项 |
作用 |
backtrace |
显示栈的所有帧。bt等同于backtrace。 |
frame n |
设置帧n为当前帧 |
up |
设置父帧为当前帧 |
down |
设置子帧为当前帧 |
frame |
显示当前帧 |
info frame |
显示当前帧的局部变量、形参等信息 |
info args |
显示当前帧的参数 |
info locals |
显示当前帧的本地变量 |
info reg |
显示当前帧的寄存器 |
- 栈帧(stack frame)中保存与函数调用关联的运行时信息。每个帧保存该层函数的局部变量、形参、调用函数的位置等。正在执行的函数帧编号为0,其父帧编号依次为1,以此类推。
10. 执行控制
选项 |
作用 |
continue |
继续执行。 c等同与continue |
next |
单步执行,跳过函数调用。n等同与next |
step |
单步执行,进入函数调用。s等同与step |
until [location] |
执行到 location 指定的位置 |
finish |
执行到当前帧返回 |
signal sig |
向进程发送信号signal并继续执行 |
(gdb) signal SIGINT
也可以是数字,如:
(gdb) signal 2
11. 显示变量
选项 |
作用 |
set var = expr |
变量var赋值为expr |
print [/f] expr |
按照 /f 指定的格式显示expr |
x [/Nuf] addr |
按 /Nuf 指定的格式显示地址addr处的数据 |
display [/f] expr |
每次停止执行时,自动显示expr的值 |
undisplay n |
删除display变量 |
info display |
列出所有display变量 |
printf |
类似C函数printf()的用法 |
disassem [addr] |
显示汇编代码 |
- print /f expr 中的 f 可以是如下值之一:
x 十六进制
d 有符号十进制
u 无符号十进制
a 地址
c 字符
f 浮点数
s NULL结尾的字符串
- x [/Nuf] expr 中, Nuf依次指定多个单元 (N)、单元大小(u)、和单位类型(f)。
b byte,1个字节
h halfword,2个字节
w words,4个字节
g giant word,8个字节
(gdb) printf "x is %d.\n", x
printf 一般用于编写断点命令、宏这些扩展功能。
12. 浏览源代码
选项 |
作用 |
list |
从当前位置开始,列出后面10行源代码 |
list line |
列出行line 前后的源代码,line可以是[file:]num、[file:]function |
list - |
从当前位置开始,列出前面10行源代码 |
list f,l |
列出从 f 行到 l 行的源代码 |
list file:line |
列出指定文件的line行。这个命令会切换当前源文件 |
info sources |
显示正在使用的源文件名列表 |
info source |
显示当前源文件名 |
13. 多线程
选项 |
作用 |
info threads |
列出所有线程 |
thread n |
切换到指定的线程,n是线程编号 |
set scheduler-locking on |
只运行当前线程,锁住其他线程 |
set scheduler-locking on step |
单步执行当前线程时,锁住其他线程 |
set scheduler-locking off |
运行当前线程,同时运行其他线程 |
handle SIG32 nostop |
让程序接收到sig32信号时,不挂起 |
相关链接
GDB 常用法
GDB 调试Coredump问题
嵌入式开发中GDB调试Coredump问题
嵌入式开发中GDB串口远程调试
用backtrace()调试coredump问题
Valgrind memcheck 用法
Address Sanitizer 用法
Program received signal SIG32, Real-time event 32
SIG32 和 SIG33
参考资料
GDB Quick Reference
http://www.scott-webb.co.uk/misc/refcard.pdf