GDB常用的调试命令及方法总结

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 +offset
break -offset

在指定行号停住。
在当前行号的前面或后面的offset行停住。offiset为自然数。

break filename:linenum 
break filename:function

在源文件filename的linenum行处停住。
在源文件filename的function函数的入口处停住。

break *address

在程序运行的内存地址处停住。

break

break命令没有参数时,表示在下一条指令处停住。

break ... if <condition>

...是文件名行号等参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序。

info breakpoints [n]
info break [n]

查看断点时,可使用info命令。n表示断点号

4. 设置观察点

(不常用,但疑难问题可能用得着)

命令

功能

watch <expr>

为表达式(变量)expr设置一个观察点。一旦表达式值有变化时,马上停住程序。

rwatch <expr>

当表达式(变量)expr被读时,停住程序。

awatch <expr>

当表达式(变量)的值被读或被写时,停住程序。

info watchpoints

列出当前所设置了的所有观察点。

5. 断点维护命令

命令

功能

clear
clear <function>
clear <filename:function>
clear <linenum>
clear <filename:linenum>

清除所有的已定义的停止点。

delete [breakpoints] [range...]

删除指定的断点,breakpoints为断点号。如果不指定断点号,则表示删除所有的断点。range 表示断点号的范围(如:3-7)。其简写命令为d。

disable [breakpoints] [range...]

disable所指定的停止点,breakpoints为停止点号。如果什么都不指定,表示disable所有的停止点。简写命令是dis。

1.enable [breakpoints] [range...]
2.enable [breakpoints] once range...
3.enable [breakpoints] delete range...

1.enable所指定的停止点,breakpoints为停止点号。
2.enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动disable。
3.enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动删除。

commands [bnum]
 ... command-list ...
end

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

continue [ignore-count]
c [ignore-count]
fg [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
set step-mode on
set step-mod off

打开/关闭step-mode模式,于是,在进行单步跟踪时,程序不会因为没有debug信息而不停住。这个参数有很利于查看机器码。

finish

运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。

until 或 u

当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。

stepi 或 si
nexti 或 ni

单步跟踪一条机器指令!一条程序代码有可能由数条机器指令完成,stepi和nexti可以单步执行机器指令。

6. 搜集任务信息

命令

功能

backtrace <+-n>
bt <+-n>

打印当前的函数调用栈的所有信息。

frame <n>
f <n>
select-frame <n>

切换当前栈,无参数会打印出这些信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句。

up <n>
up-silently <n>

表示向栈的上面移动n层,可以不打n,表示向上移动一层。

down <n>
down-silently <n>

表示向栈的下面移动n层,可以不打n,表示向下移动一层。

info frame
info f

这个命令会打印出更为详细的当前栈层的信息,只不过,大多数都是运行时的内内地址。

info args

打印出当前函数的参数名及其值。

info locals

打印出当前函数中所有局部变量及其值。

info catch

打印出当前的函数中的异常处理信息。

list <linenum>
list <first>, <last>
list , <last>
list <function>
set listsize <count>

显示程序第linenum行的周围的源程序。
显示从first行到last行之间的源代码。
set命令设置一次显示源代码的行数。

forward-search <regexp>
search <regexp>
reverse-search <regexp>

搜索源代码。

directory <dirname ... >
dir <dirname ... >
show directories

指定源文件的路径。

info line linespec

打印行 linespec源码编译出的代码的起始和结束地址。

info register
info all-registers
info registers regname 

打印出除浮点数之外的所有寄存器的名称和值。
查看所有寄存器的情况(包括浮点寄存器)。
查看所指定的寄存器的情况。

call <expr>

表达式中可以一是函数,以此达到强制调用函数的目的。并显示函数的返回值,如果函数返回值是void,那么就不显示。

return
return <expression>

使用return命令取消当前函数的执行,并立即返回,如果指定了<expression>,那么该表达式的值会被认作函数的返回值。

7. 其它命令

命令

功能

disassemble

把某范围内存内容反编译为机器指令。缺省情况下,内存范围是选定帧的程序计数器周围的函数。只有一个参数时,参数值为程序计数器的值;两个参数则是指定地址范围。

print exp
print /f exp
print var@ len
print file::variable
print function::variable
set/show print address/array/elements/
null-stop/pretty/union/
object/static-members/
vtbl  <on/off>

查看变量的值。
exp是表达式,/f指定打印时的格式。
exp是C语言形式的表达式,功能很强大,如可以查看变量地址&var。
exp表达式为C格式的赋值语句,这样就可以完成变量的赋值。
print只能查看变量在内存中的表示,不能查看绝对地址的内存值,var是变量表达式,len查看表达式的个数 。
::  指定一个在文件或是一个函数中的变量

x/nfu addr

常用:x /64 addr

使用x命令可以按格式查看绝对地址的内存信息,内存信息按NFU格式打印到控制台。

nfu 是格式表达式:
n:查看内存的个数
f:显示格式,显示格式可以是i(10进制),x(16进制)。
u:按什么数据类型显示:
u:可以是下面几种类型:
b:1字节显示(Bytes)。
h:2字节显示(Halfwords)。
w:4字节显示(Words),默认显示类型为4字节显示。
g:8字节显示(Giant words)。

display <expr> 
display/<fmt> <expr> 
display/<fmt> <addr>
undisplay <dnums...>
disable/enable/delete  display <dnums...>
info display

expr是一个表达式,fmt表示显示的格式,addr表示内存地址,当你用display设定好了一个或多个表达式后,只要你的程序被停下来,GDB会自动显示你所设置的这些表达式的值。

show convenience

该命令查看当前所设置的所有的环境变量,环境变量可以通过set命令设置。

【特别说明】有任何疑问,请扫描二维码提问

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jin_Kwok

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值