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设置一个观察点。一旦表达式值有变化时,马上停住程序 | +---------------------+---------+-----------------------------------------------------------------------+ |rwatch | |当表达式(变量)expr被读时,停住程序 | +---------------------+---------+-----------------------------------------------------------------------+ |awatch | |当表达式(变量)的值被读或被写时,停住程序 | +---------------------+---------+-----------------------------------------------------------------------+ 维护停止点(Breakpoint) ----------------------- +-------------------------+---------+-----------------------------------------------------------------------+ |命令 |简写 |说明 | +=========================+=========+=======================================================================+ |break |b |linespec指定了断点设置在的源程序的行号。threadno指定了线程的ID, | |thread | |缺省则表示你的断点设在所有线程上面 | |[if ...] | | | +-------------------------+---------+-----------------------------------------------------------------------+ |clear | | 清除所有的已定义的停止点。 | +-------------------------+---------+-----------------------------------------------------------------------+ |clear | |清除所有设置在函数上的停止点 | +-------------------------+ | | |clear | | | +-------------------------+---------+-----------------------------------------------------------------------+ |clear | |清除所有设置在指定行上的停止点 | +-------------------------+ | | |clear | | | +-------------------------+---------+-----------------------------------------------------------------------+ |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 n |bt n |n是一个整数,正数表示只打印栈顶上n层的栈信息, | | | |负数表示只显示栈底下n层。 | +-------------------+------------+--------------------------------------------------------------------+ |frame [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 | |用display设定好了一个或多个表达式后,只要你的程序被停下来, | +---------------------+ |GDB会自动显示你所设置的这些表达式的值。 | |display/ | | | +---------------------+ | | |display/ | | | +---------------------+ | | |undisplay | | | +---------------------+ | | |delete | | | |display | | | +---------------------+ | | |disable | | | |display | | | +---------------------+ | | |enable | | | |display | | | +---------------------+------------+--------------------------------------------------------------------+ 查看运行时数据 --------------- 在你调试程序时,当程序被停住时,你可以使用 ``print`` 命令(简写命令为p),或是同义命令 ``inspect`` 来查看当前程序的运行数据。``print`` 命令的格式是: +----------------------+------------+------------------------------------------------------------------------+ |命令 |简写 |说明 | +======================+============+========================================================================+ |print |p |是输出的格式,如/u /x /d /o /c 。"::" 用来指定一个在文件或是一个函数| +----------------------+------------+中的变量,如 ``(gdb) p 'f2.c'::x`` | |print/ |p/ | | +----------------------+------------+------------------------------------------------------------------------+ |whatis | |打印表达式 的数据类型 | +----------------------+------------+------------------------------------------------------------------------+ |whatis | |打印上一个表达式 ``$`` 的数据类型 | +----------------------+------------+------------------------------------------------------------------------+ |ptype | |打印数据类型的描述信息。对 C 代码,typename 可以是 | | | |``class class-name`` ``struct struct-tag`` | | | |``union union-tag`` ``enum enum-tag`` | +----------------------+------------+------------------------------------------------------------------------+ |ptype | |打印表达式的类型描述信息。比 *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 | |指定下一条语句的运行点。可以是file:line格式, | | | |也可以是+num这种偏移量格式 | +----------------------+------------+------------------------------------------------------------------------+ |return [expression] | |使用return命令取消当前函数的执行,并立即返回 | +----------------------+------------+------------------------------------------------------------------------+ |signal | |想被调试程序发信号。 | | | |UNIX的系统信号量通常从1到15,所以取值也在这个范围 | +----------------------+------------+------------------------------------------------------------------------+