1. 运行GDB
启动 GDB 的方法有以下几种:
- gdb <program>:program 是用户的执行文件,一般在当然目录下。
例如:gdb bmu_run
- gdb <program> core:用 GDB 同时调试一个运行程序和 core 文件,core 是程序非法执行后 core dump 后产生的文件。
例如:gdb bmu_run –c core.xxxxx,其中xxxxx为进程的pid
- gdb <program> <PID>:如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。GDB 会自动 attach 上去,并调试他。program 应该在 PATH 环境变量中搜索得到。
例如:gdb –p 17105
2. 运行命令
命令 | 功能 |
run para… | 运行程序或重新运行程序,可以带参数,相当于命令行参数。 |
Ctrl+C | 程序暂停,可以操作gdb的命令。 |
Continue | 继续运行 |
Quit | 退出gdb |
注:熟悉加粗的命令即可进行一般的调试。
3. 设置断点
命令 | 功能 |
break <function> | 在进入指定函数时停住。 |
break <linenum> | 在指定行号停住。 |
break filename:linenum | 在源文件filename的linenum行处停住。 |
break *address | 在程序运行的内存地址处停住。 |
break | break命令没有参数时,表示在下一条指令处停住。 |
break ... if <condition> | ...是文件名行号等参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序。 |
info breakpoints [n] | 查看断点时,可使用info命令。n表示断点号 |
4. 设置观察点
(不常用,但疑难问题可能用得着)
命令 | 功能 |
watch <expr> | 为表达式(变量)expr设置一个观察点。一旦表达式值有变化时,马上停住程序。 |
rwatch <expr> | 当表达式(变量)expr被读时,停住程序。 |
awatch <expr> | 当表达式(变量)的值被读或被写时,停住程序。 |
info watchpoints | 列出当前所设置了的所有观察点。 |
5. 断点维护命令
命令 | 功能 |
clear | 清除所有的已定义的停止点。 |
delete [breakpoints] [range...] | 删除指定的断点,breakpoints为断点号。如果不指定断点号,则表示删除所有的断点。range 表示断点号的范围(如:3-7)。其简写命令为d。 |
disable [breakpoints] [range...] | disable所指定的停止点,breakpoints为停止点号。如果什么都不指定,表示disable所有的停止点。简写命令是dis。 |
1.enable [breakpoints] [range...] | 1.enable所指定的停止点,breakpoints为停止点号。 |
commands [bnum] | 为断点号bnum指写一个命令列表。当程序被该断点停住时,gdb会依次运行命令列表中的命令。 |
continue [ignore-count] | 恢复程序运行,直到程序结束,或是下一个断点到来。ignore-count表示忽略其后的断点次数。continue,c,fg三个命令都是一样的意思。 |
step <count> | 单步跟踪,如果有函数调用,他会进入该函数。进入函数的前提是,此函数被编译有debug信息。很像VC等工具中的step in。后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。 |
next <count> | 同样单步跟踪,如果有函数调用,他不会进入该函数。很像VC等工具中的step over。后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。 |
set step-mode | 打开/关闭step-mode模式,于是,在进行单步跟踪时,程序不会因为没有debug信息而不停住。这个参数有很利于查看机器码。 |
finish | 运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。 |
until 或 u | 当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。 |
stepi 或 si | 单步跟踪一条机器指令!一条程序代码有可能由数条机器指令完成,stepi和nexti可以单步执行机器指令。 |
6. 搜集任务信息
命令 | 功能 |
backtrace <+-n> | 打印当前的函数调用栈的所有信息。 |
frame <n> | 切换当前栈,无参数会打印出这些信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句。 |
up <n> | 表示向栈的上面移动n层,可以不打n,表示向上移动一层。 |
down <n> | 表示向栈的下面移动n层,可以不打n,表示向下移动一层。 |
info frame | 这个命令会打印出更为详细的当前栈层的信息,只不过,大多数都是运行时的内内地址。 |
info args | 打印出当前函数的参数名及其值。 |
info locals | 打印出当前函数中所有局部变量及其值。 |
info catch | 打印出当前的函数中的异常处理信息。 |
list <linenum> | 显示程序第linenum行的周围的源程序。 |
forward-search <regexp> | 搜索源代码。 |
directory <dirname ... > | 指定源文件的路径。 |
info line linespec | 打印行 linespec源码编译出的代码的起始和结束地址。 |
info register | 打印出除浮点数之外的所有寄存器的名称和值。 |
call <expr> | 表达式中可以一是函数,以此达到强制调用函数的目的。并显示函数的返回值,如果函数返回值是void,那么就不显示。 |
return | 使用return命令取消当前函数的执行,并立即返回,如果指定了<expression>,那么该表达式的值会被认作函数的返回值。 |
7. 其它命令
命令 | 功能 |
disassemble | 把某范围内存内容反编译为机器指令。缺省情况下,内存范围是选定帧的程序计数器周围的函数。只有一个参数时,参数值为程序计数器的值;两个参数则是指定地址范围。 |
print exp | 查看变量的值。 |
x/nfu addr 常用:x /64 addr | 使用x命令可以按格式查看绝对地址的内存信息,内存信息按NFU格式打印到控制台。 nfu 是格式表达式: |
display <expr> | expr是一个表达式,fmt表示显示的格式,addr表示内存地址,当你用display设定好了一个或多个表达式后,只要你的程序被停下来,GDB会自动显示你所设置的这些表达式的值。 |
show convenience | 该命令查看当前所设置的所有的环境变量,环境变量可以通过set命令设置。 |
【特别说明】有任何疑问,请扫描二维码提问
: