GDB 调试
-------------------------------------------------------------------------------
gdb 帮助文档
help -- 查看 gdb 的命令种类
help
apropos
info
show
gdb 中运行 unix 的 shell 程序
shell
make
历史记录
当你用 gdb 的 print 查看程序运行时的数据时,你每一个 print 都会被 gdb 记录下来.gdb 会以 $1, $2, $3 ...这样的方式为你每一个 print 命令编上号.于是,你可以使用这个编号访问以前的表达式,如 $1.这个功能所带来的好处是,如果你先前输入了一个比较长的表达式,如果你还想查看这个表达式的值,你可以使用历史记录来访问,省去了重复输入.
启动程序
run
--------------------------------------------------------------------------------
GDB 环境设置
gdb 设置
设置显示选项 地址 set print address
show print address -- 查看 print address 选项信息
数组元素单独行显示 set print array
show print array -- 查看 print array 选项信息
显示数组元素显示 set print elements
show print elements -- 查看 print elements 选项信息.
设置字符串显示 set print null-stop
show print null-stop -- 查看 print null-stop 选项信息
设置结构体变量显示 set print pretty
show print pretty -- 查看 gdb 是如何显示结构体的.
设置字符显示 set print sevenbit-strings
show print sevenbit-strings -- 查看字符显示开关是否打开.
设置联合体显示 set print union
show print union -- 查看联合体数据的显示方式
设置对象显示 set print object
show print object -- 查看对象选项的设置.
设置静态成员显示 set print static-members
show print static-members -- 查看静态数据成员选项设置.
设置虚函数表显示 set print vtbl
show print vtbl -- 查看虚函数显示格式的选项.
设置运行程序的相关环境及其参数 指定源文件的路径 directory
directory -- 清除所有的自定义的源文件搜索路径信息.
show directories -- 显示定义了的源文件搜索路径.
运行参数 set args -- 可指定运行时参数
show args -- 命令可以查看设置好的运行参数
运行环境 path
show paths -- 查看程序的运行路径
set environment varname=value -- 设置环境变量
show environment [varname] -- 查看环境变量
工作目录 cd
pwd -- 显示当前的所在目录
程序的输入输出 info terminal -- 显示你程序用到的终端的模式
tty -- 命令可以指写输入输出的终端设备
重定向控制程序输出
堆栈帧设置 set backtrace
调试模式 set step-mode [on | off] -- step-mode 模式,于是,在进行单步跟踪时,程序不会因为没有debug信息而不停住.这个参数有很利于查看机器码.
--------------------------------------------------------------------------------
GDB 源码查看
显示源代码
list
list
list
list
list
list -- 显示当前行后面的源程序.
list - -- 显示当前行前面的源程序.
list
设置和获得显示源码的行数
set listsize
show listsize -- 查看当前listsize的设置.
搜索源代码
forward-search
search
reverse-search
源代码的内存
info line
info line
info line
info line
查看汇编代码
disassemble -- 查看源程序的当前执行时的机器码,这个命令会把目前内存中的指令 dump 出来.
--------------------------------------------------------------------------------
GDB 停止点设置及维护
断点(BreakPoint)
设置断点:(threadno 指定了线程的 ID,注意,这个 ID 是 gdb 分配的,可以通过 "info threads" 命令来查看正在运行程序中的线程信息) break thread
break +offset thread
break -offset thread
break
break filename:linenum thread
break
break filename:function thread
break *address -- 在程序运行的内存地址处停住.
break ... thread
tbreak -- 设置只停止一次的断点.用法和 break 类似
查看断点 info breakpoints [n]
info break [n]
观察点(WatchPoint) -- 观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序.
设在观察点 watch
rwatch
awatch
查看观察点 info watchpoints -- 列出当前所设置了的所有观察点.
捕捉点(CatchPoint) -- 设置捕捉点来补捉程序运行时的一些事件.如:载入共享库(动态链接库)或是 C++ 的异常《/p>
设置捕捉点 catch
catch 一个 C++ 捕捉到的异常.(catch 为关键字)
exec 调用系统调用 exec 时.(exec 为关键字,目前此功能只在 HP-UX 下有用)
fork 调用系统调用 fork 时.(fork 为关键字,目前此功能只在 HP-UX 下有用)
vfork 调用系统调用 vfork 时.(vfork 为关键字,目前此功能只在 HP-UX 下有用)
load 或 load
unload 或 unload
tcatch
维护停止点
清除停止点 clear -- 所有的已定义的停止点.
clear
clear
clear
clear
删除停止点 delete [range] -- 删除停止点.其简写命令为 d.
禁用停止点 disable [range] -- 禁用停止点
启用停止点 enable [range] -- 启用停止点.
enable once [rang] -- 启用停止点一次,当程序停止后,该停止点马上被 gdb 自动 disable.
enable count [rang] -- 启用停止点 count 次,当程序停止后,该停止点马上被 gdb 自动 disable.
enable delete [rang] -- 启用停止点一次,当程序停止后,该停止点马上被 gdb 自动删除.
停止条件维护 -- 以用 condition 命令来修改断点的条件.(只有break和watch命令支持if,catch目前暂不支持if) condition
condition
忽略停止点 N 次 ignore
为停止点设定运行命令 格式:
commands [bnum]
... command-list ...
// 为断点号 bnumi写一个命令列表.当程序被该断点停住时,gdb 依次运行命令列表中的命令.
end
例如:
break foo if x>0
commands
printf "x is %d/n",x
continue
end
--------------------------------------------------------------------------------
信号(Signals)
添加信号处理
handle
在 gdb 中定义一个信号处理.信号
stop -- 当被调试的程序收到信号时,gdb 会停住你的程序.
print -- 当被调试的程序收到信号时,gdb 会显示出一条信息.
noprint -- 当被调试的程序收到信号时,gdb 不会告诉你收到信号的信息.
pass -- 当被调试的程序收到信号时,gdb 不处理信号.这表示,gdb 会把这个信号交给被调试程序会处理.
noignore -- 当被调试的程序收到信号时,gdb 不处理信号.这表示,gdb 会把这个信号交给被调试程序会处理.
nopass -- 当被调试的程序收到信号时,gdb 不处理信号.这表示,gdb 会把这个信号交给被调试程序会处理.
1gnore -- 当被调试的程序收到信号时,gdb 不会让被调试程序来处理这个信号.
查看处理信号
info signals -- 查看有哪些信号在被 gdb 检测中.
info handle -- 查看有哪些信号在被 gdb 检测中.
--------------------------------------------------------------------------------
GDB 程序调试
恢复执行
continue [ignore-count] -- ignore-count 表示忽略其后的断点次数.恢复程序运行,直到程序结束,或是下一个断点到来.缩写 c
fg [ignore-count] -- ignore-count 表示忽略其后的断点次数.恢复程序运行,直到程序结束,或是下一个断点到来.缩写 c
单步调试
step
next
跟踪机器指令
与之一样有相同功能的命令是 “display/i $pc” ,当运行完这个命令后,单步跟踪会在打出程序代码的同时打出机器指令(也就是汇编代码)
stepi 或 si -- 单步跟踪一条机器指令,简写 si
nexti 或 ni -- 单步跟踪一条机器指令,简写 ni
函数调试
finish -- 运行程序,直到当前函数完成返回.并打印函数返回时的堆栈地址和返回值及参数值等信息.
return
call
print 与 printf 也可以做到类似的功能和 call 的不同是,如果函数返回 void,call 则不显示,print 则显示函数返回值,并把该值存入历史数据中.
循环体调试
until -- 可以运行程序直到退出循环体.简写 u
修改变量值
print varname=var -- 修改被调试程序运行时的变量值
set var varname=value -- 修改被调试程序运行时的变变量
whatis varname -- 查看变量的类型
跳转执行
jump
jump -- 跳转到指定的程序内存地址运行. 是代码行的内存地址.
注意 jump 指令不会改变当前的程序栈中的内容,所以,当你从一个函数跳到另一个函数时,当函数运行完返回时进行弹栈操作时必然会发生错误.
jump 命令只是改变了指令寄存器中的值.于是可以使用 “set $pc” 来更改跳转执行的地址.如: set $pc = 0x485
产生信号量
signal
--------------------------------------------------------------------------------
GDB 运行是数据
查看运行时数据
print /
:: -- 指定一个在文件或是一个函数中的变量.
{
u -- 按十六进制格式显示无符号整型.
o -- 按八进制格式显示变量.
t -- 按二进制格式显示变量.
a -- 按十六进制格式显示变量.
c -- 按字符格式显示变量.
f -- 按浮点数格式显示变量.
注意: 1.若出现变量重名,局部变量会隐藏全局变量.若想查看全局变量的值时,可以使用“::”操作符.
2.可以通过这种形式指定你所想查看的变量 eg:
*'filename'::variable
*function::variable
printf "fmt",arg,... -- 打印格式化字符灿 fmt.
查看内存
examine/
f 表示显示的格式 s -- 按字符串格式显示内存地址内容.
i -- 查看内存地址的机器指令内容
x -- 按十六进制格式显示地址内容.
d -- 按十进制格式显示地址内容.
u -- 按十六进制格式显示无符号整型.
o -- 按八进制格式显示地址内容.
t -- 按二进制格式显示地址内容.
a -- 按十六进制格式显示地址内容.
c -- 按字符格式显示地址内容.
f -- 按浮点数格式显示地址内容.
u 表示从当前地址往后请求的字节数,如果不指定的话,gdb默认是 4 个 bytes. b -- 表示单字节
h -- 表示双字节
w -- 表示四字节
g -- 表示八字节
自动显示
设置自动显示 display/
display/
i -- 输出格式为机器指令码,也就是汇编.
s -- 输出格式为字符串
删除自动显示 undisplay
delete display
启用和禁自动显示 sable display
enable display
查看栈信息
backtrace
若是负数,只打印栈顶下 n 层的栈信息,
若无则打印当前的函数调用栈的所有信息
frame -- 会打印出这些信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句.
info frame -- 这个命令会打印出更为详细的当前栈层的信息,只不过,大多数都是运行时的内内地址.
info args -- 打印出当前函数的参数名及其值.
info locals -- 打印出当前函数中所有局部变量及其值.
info catch -- 打印出当前的函数中的异常处理信息.
切换函数栈位置
frame
p
down
select-frame
up-silently
down-silently
查看寄存器
info registers -- 查看寄存器的情况.(除了浮点寄存器)
info all-registers -- 查看所有寄存器的情况.(包括浮点寄存器)
info registers
线程查看与切换线程
info threads -- 查看当前线程
thread
--------------------------------------------------------------------------------
自定义命令
定义一个命令
格式
define comdName
...
end
条件语句
if cond_expr
...
else
...
end
循环语句
while cond_expr
...
end
定义一个命令的文档信息(在 help cmdName 的时候显示)
document cmdName
...
end
查看自定命令
help user-define -- 查看所有用户自定义的命令
show user cmdName -- 查看用户定义的 cmdName 的命令.
help cmdName -- 查看用户自定义的 cmdName 的帮助文档
show max-user-call-depth -- 查看用户自定义命令的递归最大深度,缺省是 1024
set-user-call-depth