gcc -g |
生成可执行文件 |
---|---|
-gstabs | 关闭编译优化 |
gdb |
执行gdb |
gdb |
同时调试一个运行程序和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 |
打印变量 |
x/<n/f/u> |
查看内存的值。n 是一个正整数,表示显示内存的长度;f 表示显示的格式;u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes; |
b |
指定行打断点 |
b |
指定文件和行打断点 |
b |
执行函数入口打断点 |
b * | 在程序运行的内存地址处打断点 |
b + |
在当前行号的前面或后面的offset行打断点。offset为自然数 |
b | 下一条指令处打断点 |
b if |
指定条件下断点 |
i/info b/break [n] | 查看断点信息, n为断点号 |
bt/backtrace | 查看调用栈 |
bt |
n是一个正整数,表示只打印栈顶上n层的栈信息。 -n表一个负整数,表示只打印栈底下n层的栈信息 |
f/frame |
切换当前栈,n是栈中的层编号。frame 0,表示栈顶,frame 1,表示栈的第二层。 |
up |
表示向栈的上面移动n层,可以不打n,表示向上移动一层。 表示向栈的下面移动n层,可以不打n,表示向下移动一层。 |
select-frame |
对应于 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 |
清除所有设置在指定行上的停止点 |
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 |
linespec指定了断点设置在的源程序的行号。 threadno指定了线程的ID,注意,这个ID是GDB分配的,你可以通过“info threads”命令来查看正在运行程序中的线程信息。 如果你不指定thread |
forward-search |
向前搜索源代码 |
reverse-search |
全部搜索, |
dir/directory <dirname…> | 加一个源文件路径到当前路径的前面 |
directory | 清除所有的自定义的源文件搜索路径信息 |
show directories | 显示定义了的源文件搜索路径 |
info line | 查看源代码在内存中的地址。info line后面可以跟“行号”,“函数名”,“文件名:行 号”,“文件名:函数名”,这个命令会打印出所指定的源码在运行时的内存地址 |
disassemble func | 查看源程序的当前执行时的机器码 |
@ | 是一个和数组有关的操作符。“@”的左边是第一个内存的地址的值,“@”的右边则你你想查看内存的长度 |
:: | 指定一个在文件或是一个函数中的变量 |
{ |
表示一个指向内存地址 |
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 |
这个选项主要是设置数组的,如果你的数组太大了,那么就可以指定一个 |
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 |
指定下一条语句的运行点。 |
jump | address是代码行的内存地址 |
set $pc=0x485 | 程序运行时,有一个寄存器用于保存当前代码所在的内存地址。所以,jump命令也就是改变了这 个寄存器中的值。于是,你可以使用“set $pc”来更改跳转执行的地址。 |
signal |
产生信号量 UNIX的系统信号量通常从1到15。所以 |
return |
还没有执行的语句并强制返回 取消当前函数的执行,并立即返回,如果指定了 |
call |
强制调用函数。表达式中可以是一个函数,以此达到强制调用函数的目的。并显示函数返回值。如果函数返回值是void,那么就不显 示。 |
print |
print后面跟表达式,也可以用来调用函数,print和call不同的是,如果函数返回void。call则不显示,print则显示函数返回值,并把该值存入历史数据中。 |
show language | 查看当前的语言环境,C语言被认为是默认的环境。 |
info frame | 查看当前函数的程序语言 |
info source | 查看当前文件的程序语言 |