GDB 命令速查¶
info 命令¶
命令 | 简写 | 说明 | |
---|---|---|---|
info breakpoints | 查看断点,可以后接参数n表示查看某个断点号 | ||
info watchpoints | 列出当前所设置了的所有观察点 | ||
info args | 打印出当前函数的参数名及其值 | ||
info locals | 打印出当前函数中所有局部变量及其值 | ||
info frame | info f | 打印出更为详细的当前栈层的信息,只不过,大多数都是运行时的内存地址, 如函数地址,调用函数的地址,被调用函数的地址。 | |
info signals | 打印信号信息 | ||
info handle | 查看有哪些信号在被GDB检测中 | ||
info threads | 查看GDB为程序分配的线程号 | ||
info display | 查看display设置的自动显示的信息 | ||
info program | 当进程被gdb停住时,使用该命令查看程序的是否在运行、进程号和被暂停的原因 |
设置观察点(Watchpoint)¶
观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。
命令 | 简写 | 说明 |
---|---|---|
watch <expr> | 为表达式(变量)expr设置一个观察点。一旦表达式值有变化时,马上停住程序 | |
rwatch <expr> | 当表达式(变量)expr被读时,停住程序 | |
awatch <expr> | 当表达式(变量)的值被读或被写时,停住程序 |
维护停止点(Breakpoint)¶
命令 | 简写 | 说明 |
---|---|---|
break <linespec> thread <threadno> [if …] | b | linespec指定了断点设置在的源程序的行号。threadno指定了线程的ID, 缺省则表示你的断点设在所有线程上面 |
clear | 清除所有的已定义的停止点。 | |
clear <function> | 清除所有设置在函数上的停止点 | |
clear <filename:function> | ||
clear <linenum> | 清除所有设置在指定行上的停止点 | |
clear <filename:linenum> | ||
delete [range] | d | 删除指定的断点,breakpoints为断点号,若不指定断点号表示删除所有的断点。 range 表示断点号的范围(如:3-7) |
disable [range] | dis | disable所指定的停止点,breakpoints为停止点号。 如果什么都不指定,表示disable所有的停止点。 |
enable [range] | enable所指定的停止点,breakpoints为停止点号 | |
enable once [range] | enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动disable | |
enable delete range | enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动删除。 |
停止点或观察点的自动运行命令(Command)¶
我们可以使用GDB提供的command命令来设置停止点(或观察点)的运行命令。也就是说,当运行的程序在被停止住时,我们可以让其自动运行一些别的命令,这很有利行自动化调试。
为断点号bnum指写一个命令列表。当程序被该断点停住时,gdb会依次运行命令列表中的命令:
commands [bnum] ... command-list ... end
或者设置断点的同时给出命令:
break foo if x>0 commands printf "x is %d\n",x continue end
查看栈信息¶
查看程序是在哪里停住的:当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入“栈”(Stack)中。
命令 | 简写 | 说明 |
---|---|---|
backtrace | bt | 打印当前的函数调用栈的所有信息 |
backtrace<bt> n | bt n | n是一个整数,正数表示只打印栈顶上n层的栈信息, 负数表示只显示栈底下n层。 |
frame<f> [n] | f n | 打印出层编号,当前的函数名,函数参数值,函数所在文件及行号, 函数执行到的语句。n是栈里面层编号,如frame 0表示栈顶。 |
up [n] | 表示向栈的上面移动n层,缺省n表示向上移动一层。 | |
down [n] | 表示向栈的下面移动n层,缺省n表示向下移动一层。 | |
info frame | info f | 打印出更为详细的当前栈层的信息,只不过,大多数都是运行时的内存地址 ,如函数地址,调用函数的地址,被调用函数的地址。 |
单步跟踪调试¶
命令 | 简写 | 说明 |
step | s | 单步跟踪,如果有函数调用,他会进入该函数。进入函数的前提是, 此函数被编译有debug信息(使用 gcc -g 参数编译)。 |
next | n | 同样单步跟踪,如果有函数调用,他不会进入该函数。 |
continue | c | 恢复程序运行,直到程序结束,或是下一个断点到来 |
finish | 运行程序,直到当前函数完成返回。 并打印函数返回时的堆栈地址和返回值及参数值等信息 | |
until | u | 运行程序直到退出循环体 |
display <expr> | 用display设定好了一个或多个表达式后,只要你的程序被停下来, GDB会自动显示你所设置的这些表达式的值。 | |
display/<fmt> <expr> | ||
display/<fmt> <addr> | ||
undisplay <dnums…> | ||
delete display <dnums…> | ||
disable display <dnums…> | ||
enable display <dnums…> |
查看运行时数据¶
在你调试程序时,当程序被停住时,你可以使用 print
命令(简写命令为p),或是同义命令 inspect
来查看当前程序的运行数据。print
命令的格式是:
命令 | 简写 | 说明 |
---|---|---|
print <expr> | p <expr> | </f>是输出的格式,如/u /x /d /o /c 。”::” 用来指定一个在文件或是一个函数
中的变量,如 (gdb) p 'f2.c'::x |
print/<f> <expr> | p/<f> <expr> | |
whatis <expr> | 打印表达式 <expr> 的数据类型 | |
whatis | 打印上一个表达式 $ 的数据类型 |
|
ptype <typename> | 打印数据类型的描述信息。对 C 代码,typename 可以是
class class-name struct struct-tag
union union-tag enum enum-tag |
|
ptype <expr> | 打印表达式的类型描述信息。比 whatis 打印的信息更详细。 它可以提供一个结构体的定义 | |
ptype |
显示出静态数组的取值:可以直接用print数组名,就可以显示数组中所有数据的内容了。
显示出动态数组的取值:@的左边是数组的首地址的值,也就是变量array所指向的内容,右边则是数据的长度,其保存在变量len中。:
int *array = (int *) malloc (len * sizeof (int)); (gdb) p *array@len $1 = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40}
ptype:比whatis的功能更强,他可以提供一个结构的定义。例如:
struct complex {double real; double imag;} v; (gdb) whatis v type = struct complex (gdb) ptype v type = struct complex { double real; double imag; }
多线程环境¶
命令 | 简写 | 说明 |
---|---|---|
info threads | 查看GDB为程序分配的线程号 | |
thread num | 切换线程,命令行参数num是gdb内定的线程号。 |
其他¶
命令 | 简写 | 说明 |
---|---|---|
set print pretty on | 当GDB显示结构体时会比较漂亮 | |
show convenience | 该命令查看当前所设置的所有的环境变量 | |
set $foo =*object_ptr | 设置GDB的环境变量(环境变量作为左值和右值时都要加$符号) | |
set [var] width=47 | 改变被调试程序中的变量 | |
jump <linespec> | 指定下一条语句的运行点。<linespce>可以是file:line格式, 也可以是+num这种偏移量格式 | |
return [expression] | 使用return命令取消当前函数的执行,并立即返回 | |
signal <singal> | 想被调试程序发信号。 UNIX的系统信号量通常从1到15,所以<singal>取值也在这个范围 |