| -gstabs |
关闭编译优化 |
| gdb |
执行gdb |
| gdb core |
同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件 |
| gdb |
指定这个服务程序运行时的进程ID, gdb会自动attach上去,并调试他 |
| -s |
从指定文件中读取符号表 |
| -se |
从指定文件中读取符号表信息,并把他用在可执行文件中 |
| -c |
调试时core dump的core文件 |
| -d |
加入一个原文件的搜索路径,默认搜索路径是环境变量中PATH所定义的路径 |
| help |
查看某种类的命令帮助 |
| shell |
使用UNIX的shell命令 |
| make |
重新build自己的程序 |
| 【enter】 |
直接回车,重复上一行命令 |
| start |
运行程序,执行到主程序入口 |
| r/run |
运行程序 |
| c/continue [ignore-count] |
继续执行程序,知道下一断点或程序结束. ignore-count表示忽略其后的断点次数 |
| finish |
运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息 |
| s/step [count] |
单步进入被编译有debug信息的函数. [count]表示执行后面的count条指令,然后再停住 |
| set step-mode on set step-mode off |
打开、关闭step-mode模式。程序不会因为没有debug信息而不停住 |
| u/until |
运行程序直到退出循环体 |
| n/next [count] |
单步跳过.[count]表示执行后面的count条指令,然后再停住 |
| si/stepi |
单步执行汇编代码,执行完命令,打出程序代码的同时会打出机器指令 |
| ni/nexti |
单步跳过汇编代码,执行完命令,打出程序代码的同时会打出机器指令 |
| l/list |
显示当前行后面的源程序 |
| l/list - |
显示当前行前面的源程序 |
| l/list + |
显示当前行后面的源程序 |
| l/list , |
显示从first行到last行之间的源代码 |
| l/list , |
显示从当前行到last行之间的源代码 |
| l/list |
显示程序第linenum行的周围的源程序 |
| l/list |
显示函数名为function的函数的源程序 |
| set listsize |
设置一次显示的源代码行数 |
| show listsize |
查看当前的listsize的设置 |
| p/print p/print / |
打印变量 是输出的格式 |
| x/<n/f/u> |
查看内存的值。n 是一个正整数,表示显示内存的长度;f 表示显示的格式;u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes;表示一个内存地址。 |
| b |
指定行打断点 |
| b : |
指定文件和行打断点 |
| b |
执行函数入口打断点 |
| b * |
在程序运行的内存地址处打断点 |
| b + b - |
在当前行号的前面或后面的offset行打断点。offset为自然数 |
| b |
下一条指令处打断点 |
| b if |
指定条件下断点 |
| i/info b/break [n] |
查看断点信息, n为断点号 |
| bt/backtrace |
查看调用栈 |
| bt bt <-n> |
n是一个正整数,表示只打印栈顶上n层的栈信息。 -n表一个负整数,表示只打印栈底下n层的栈信息 |
| f/frame |
切换当前栈,n是栈中的层编号。frame 0,表示栈顶,frame 1,表示栈的第二层。 |
| up down |
表示向栈的上面移动n层,可以不打n,表示向上移动一层。 表示向栈的下面移动n层,可以不打n,表示向下移动一层。 |
| select-frame up-silently down-silently |
对应于 frame 命令。 对应于 up 命令。 对应于 down 命令。不打出栈层信息 |
| frame/f |
查看当前栈层信息。 会打印出这些信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句。 |
| info frame/f |
打印出更为详细的当前栈层的信息,只不过,大多数都是运行时的内内地址。 |
| info args |
打印当前函数的参数名及其值 |
| info locals |
打印当前函数中所有的局部变量 |
| info catch |
打印当前函数中的异常处理信息 |
| watch |
为表达式(变量)设置观察点。一旦值有变化,马上停住程序 |
| rwatch |
当表达式(变量)被读时,停止程序 |
| awatch |
当表达式(变量)的值被读或写时,停止程序 |
| info watchpoints |
列出当前所设置的所有观察点 |
| catch |
当event发生时,停止程序。 |
| BreakPoint WatchPoint CatchPoint |
断点 观察点 捕捉点 统称为停止点 |
| delete、clear、disable、enable |
维护停止点 |
| clear |
清除所有已定义的停止点 |
| clear clear filename:function |
清除所有设置在函数上的停止点 |
| clear clear filename:linenum |
清除所有设置在指定行上的停止点 |
| d/delete [breakpoints][range…] |
删除指定断点,breakpoints为断点号。如果不指定断点号,表示删除所有的断点。 range表示断点号的范围(如:3-7)。 |
| dis/disable [breakpoints][range…] |
禁用指定断点,如果什么都不指定,表示disable所有的停止点 |
| enable [breakpoints][range…] |
激活所指定停止点。 |
| enable [breakpoints] once [range…] |
激活所指定的停止点一次,当程序停止后,该停止点马上被GDB自动disable |
| enable [breakpoints] delete [range…] |
激活所指定的停止点一次,当程序停止后,该停止点马上被GDB自动delete |
| condition |
修改断点号为bnum的停止条件为expression |
| condition |
清除断点号为bnum的停止条件 |
| ignore |
表示忽略断点号为bnum的停止条件count次 |
| commands [bnum] … command-list… end |
使用GDB提供的command命令来设置停止点的运行命令。也就是说,当运行的程序在被停止住时, 我们可以让其 自动运行一些别的命令,这很有利行自动化调试. 为断点号bnum指写一个命令列表。当程序被该断点停住时,gdb会依次运行命令列表中的命令 |
| commands end |
清除commands命令 |
| handle |
在GDB中定义一个信号处理。 |
| i/info signals i/info handle |
查看有哪些信号在被GDB检测中。 |
| break thread break thread if ... |
linespec指定了断点设置在的源程序的行号。 threadno指定了线程的ID,注意,这个ID是GDB分配的,你可以通过“info threads”命令来查看正在运行程序中的线程信息。 如果你不指定thread 则表示你的断点设在所有线程上面。你还可以为某线程指定断点条件。 |
| forward-search search |
向前搜索源代码 |
| reverse-search |
全部搜索,就是正则表达式,也主一个字符串的匹配模式 |
| dir/directory <dirname…> |
加一个源文件路径到当前路径的前面 |
| directory |
清除所有的自定义的源文件搜索路径信息 |
| show directories |
显示定义了的源文件搜索路径 |
| info line |
查看源代码在内存中的地址。info line后面可以跟“行号”,“函数名”,“文件名:行 号”,“文件名:函数名”,这个命令会打印出所指定的源码在运行时的内存地址 |
| disassemble func |
查看源程序的当前执行时的机器码 |
| @ |
是一个和数组有关的操作符。“@”的左边是第一个内存的地址的值,“@”的右边则你你想查看内存的长度 |
| :: |
指定一个在文件或是一个函数中的变量 |
| {} |
表示一个指向内存地址的类型为tpye的一个对象 |
| display |
expr是一个表达式,fmt表示显示的格式,addr表示内存地址,当你用display设定好了一个或多个表达式后,只要你的 程序被停下来,GDB会自动显示你所设置的这些表达式的值。 |
| display/i $pc |
格式i和s同样被display支持;$pc是GDB的环境变量,表示着指令的地址,/i则表示输出格式为机器指令码,也就是汇编。于是当程序停下后,就会出 现源代码和机器指令码相对应的情形,这是一个很有意思的功能。 |
| undisplay <dnums...> delete display <dnums...> |
删除自动显示,dnums意为所设置好了的自动显式的编号。如果要同时删除几个,编号可以用空格分隔,如果要删除一个 范围内的编号,可以用减号表示(如:2-5) |
| disable display <dnums...> enable display <dnums...> |
disable和enalbe不删除自动显示的设置,而只是让其失效和恢复。 |
| info display |
查看display设置的自动显示的信息 |
| set print address set print address on set print address off |
打开、关闭地址输出,当程序显示函数信息时,GDB会显出函数的参数地址。系统默认为打开的 |
| show print address |
查看当前地址显示选项是否打开 |
| set print elements |
这个选项主要是设置数组的,如果你的数组太大了,那么就可以指定一个来指定数据显示的最大 长度,当到达这个长度时,GDB就不再往下显示了。如果设置为0,则表示不限制。 |
| show print elements |
查看print elements的选项信息。 |
| set print null-stop <on/off> |
如果打开了这个选项,那么当显示字符串时,遇到结束符则停止显示。这个选项默认为off |
| set print pretty on |
如果打开printf pretty这个选项,那么当GDB显示结构体时会比较漂亮。 |
| show print pretty |
查看GDB是如何显示结构体的。 |
| set print sevenbit-strings <on/off> |
设置字符显示,是否按“nnn”的格式显示,如果打开,则字符串或字符数据按nnn显示,如“65”。 |
| show print sevenbit-strings |
查看字符显示开关是否打开。 |
| set print union <on/off> |
设置显示结构体时,是否显式其内的联合体数据 |
| show print union |
查看联合体数据的显示方式 |
| $1, $2,$3 |
历史记录 |
| set $foo = *object_ptr |
设置环境变量 |
| show convenience |
查看当前所设置的所有的环境变量。 |
| set $i = 0 print bar[$i++]->contents |
这是一个比较强大的功能,环境变量和程序变量的交互使用,将使得程序调试更为灵活便捷 于是,当你就不必,print bar[0]->contents, print bar[1]->contents地输入命令了。输入这样的命令后,只用敲回 车,重复执行上一条语句,环境变量会自动累加,从而完成逐个输出的功能 |
| info registers |
查看寄存器的情况,除了浮点寄存器 |
| info all-registers |
查看所有寄存器的情况,除了浮点寄存器 |
| info registers |
查看所指定的寄存器的情况 |
| jump |
指定下一条语句的运行点。可以是文件的行号,可以是file:line格式,可以是+num这种偏移量格式 |
| jump |
address是代码行的内存地址 |
| set $pc=0x485 |
程序运行时,有一个寄存器用于保存当前代码所在的内存地址。所以,jump命令也就是改变了这 个寄存器中的值。于是,你可以使用“set $pc”来更改跳转执行的地址。 |
| signal |
产生信号量 UNIX的系统信号量通常从1到15。所以取值也在这个范围。 single命令和shell的kill命令不同,系统的kill命令发信号给被调试程序时,是由GDB截获的,而single命令所发出一 信号则是直接发给被调试程序的。 |
| return |
还没有执行的语句并强制返回 取消当前函数的执行,并立即返回,如果指定了,那么该表达式的值会被认作函数的返回值 |
| call |
强制调用函数。表达式中可以是一个函数,以此达到强制调用函数的目的。并显示函数返回值。如果函数返回值是void,那么就不显 示。 |
| print |
print后面跟表达式,也可以用来调用函数,print和call不同的是,如果函数返回void。call则不显示,print则显示函数返回值,并把该值存入历史数据中。 |
| show language |
查看当前的语言环境,C语言被认为是默认的环境。 |
| info frame |
查看当前函数的程序语言 |
| info source |
查看当前文件的程序语言 |