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命令来设置停止点(或观察点)的运行命令。也就是说,当运行的程序在被停止住时,我们可以让其自动运行一些别的命令,这很有利行自动化调试。

  1. 为断点号bnum指写一个命令列表。当程序被该断点停住时,gdb会依次运行命令列表中的命令:

    commands [bnum]
    ... command-list ...
    end
    
  2. 或者设置断点的同时给出命令:

    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
  1. 显示出静态数组的取值:可以直接用print数组名,就可以显示数组中所有数据的内容了。

  2. 显示出动态数组的取值:@的左边是数组的首地址的值,也就是变量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}
    
  3. 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>取值也在这个范围