SH# 当程序停住时,我们可以通过command设置其自动执行的命令,这很利于自动化调试。 (gdb) commands [bnum] > ... commands list ... > end # 这里为断点号bnum设置一个命令列表
如: (gdb) break foo if x>0 (gdb) commands > printf "x is %dn",x > continue > end # 断点设置在函数foo中,断点条件是x>0,如果程序被断住后,也就是,一旦x的值在foo函数中大于0,GDB会自动打印出x的值,并继续运行程序。 # 如果你要清除断点上的命令序列,那么只要简单的执行一下commands命令,并直接在打个end就行了。
断点菜单
SH# 如果你使用c++,有可能下断点时遇到相同名字的函数,gdb会为你列出该函数菜单供你选择。 如: (gdb) b String::after [0] cancel [1] all [2] file:String.cc; line number:867 [3] file:String.cc; line number:860 [4] file:String.cc; line number:875 [5] file:String.cc; line number:853 [6] file:String.cc; line number:846 [7] file > 2 4 6 Breakpoint 1 at 0xb26c: file String.cc, line 867. Breakpoint 2 at 0xb344: file String.cc, line 875. Breakpoint 3 at 0xafcc: file String.cc, line 846.
# 在表达式中,有几种GDB所支持的操作符,它们可以用在任何一种语言中。 @ 是一个和数组有关的操作符,在后面会有更详细的说明。 :: 指定一个在文件或是一个函数中的变量。 {<type>} <addr> 表示一个指向内存地址<addr>的类型为type的一个对象。 # 需要注意的是,如果你的程序编译时开启了优化选项,那么在用GDB调试被优化过的程序时,可能会发生某些变量不能访问,或是取值错误码的情况。 SH# 输出格式 # 一般来说,GDB会根据变量的类型输出变量的值。但你也可以自定义GDB的输出的格式。例如,你想输出一个整数的十六进制,或是二进制来查看这个整型变量的中的位的情况。要做到这样,你可以使用GDB的数据显示格式: x 按十六进制格式显示变量。 d 按十进制格式显示变量。 u 按十六进制格式显示无符号整型。 o 按八进制格式显示变量。 t 按二进制格式显示变量。 a 按十六进制格式显示变量。 c 按字符格式显示变量。 f 按浮点数格式显示变量。
如: (gdb) p i $21 = 101 (gdb) p/a i $22 = 0x65
查看内存
SH# 你可以使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示: (gdb) x/<n/f/u> <addr> # n, f, u可选
n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。 f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。 u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。 <addr> 表示一个内存地址。
SH# GDB中关于显示的选项比较多,这里我只例举大多数常用的选项。 # 1、打开地址输出,当程序显示函数信息时,GDB会显出函数的参数地址。系统默认为打开的 (gdb) set print address (gdb) set print address on (gdb) set print address off # 关闭函数的参数地址显示 (gdb) show print address # 查看当前地址显示选项是否打开。
# 2、打开数组显示,打开后当数组显示时,每个元素占一行,如果不打开的话,每个元素则以逗号分隔。这个选项默认是关闭的。 (gdb) set print array (gdb) set print array on (gdb) set print array off (gdb) show print array (gdb) show print elements # 查看print elements的选项信息。 (gdb) set print elements <number-of-elements> # 这个选项主要是设置数组的,如果你的数组太大了,那么就可以指定一个<number-of-elements>来指定数据显示的最大长度,当到达这个长度时,GDB就不再往下显示了。如果设置为0,则表示不限制。
# 3、如果打开了这个选项,那么当显示字符串时,遇到结束符则停止显示。这个选项默认为off (gdb) set print null-stop <on/off>
# 4、如果打开printf pretty这个选项,那么当GDB显示结构体时会比较漂亮。 (gdb) set print pretty on (gdb) show print pretty # 查看GDB是如何显示结构体的。\
# 5、设置字符显示,是否按“nnn”的格式显示,如果打开,则字符串或字符数据按nnn显示,如“65”。 (gdb) set print sevenbit-strings <on/off> (gdb) show print sevenbit-strings # 查看字符显示开关是否打开。
# 6、设置显示结构体时,是否显式其内的联合体数据。 (gdb) set print union <on/off> (gdb) show print union # 查看联合体数据的显示方式 如: $1 = {it = Tree, form = {tree = Acorn, bug = Cocoon}} # 开 $1 = {it = Tree, form = {...}} # 关
# 7、在C++中,如果一个对象指针指向其派生类,如果打开这个选项,GDB会自动按照虚方法调用的规则显示输出,如果关闭这个选项的话,GDB就不管虚函数表了。这个选项默认是off。 (gdb) set print object <on/off> (gdb) show print object # 查看对象选项的设置。
# 8、这个选项表示,当显示一个C++对象中的内容是,是否显示其中的静态数据成员。默认是on。 (gdb) set print static-members <on/off> (gdb) show print static-members # 查看静态数据成员选项设置。
# 9、当此选项打开时,GDB将用比较规整的格式来显示虚函数表时。其默认是关闭的。 (gdb) set print vtbl <on/off> (gdb) show print vtbl # 查看虚函数显示格式的选项。
SH(gdb) show language # 查看当前的语言环境。如果GDB不能识为你所调试的编程语言,那么,C语言被认为是默认的环境。 (gdb) info frame # 查看当前函数的程序语言。 (gdb) info source # 查看当前文件的程序语言。如果GDB没有检测出当前的程序语言,那么你也可以手动设置当前的程序语言。使用set language命令即可做到。当set language命令后什么也不跟的话,你可以查看GDB所支持的语言种类: (gdb) set language The currently understood settings are: local or auto Automatic setting based on source file c Use the C language c++ Use the C++ language asm Use the Asm language chill Use the Chill language fortran Use the Fortran language java Use the Java language modula-2 Use the Modula-2 language pascal Use the Pascal language scheme Use the Scheme language # 于是你可以在set language后跟上被列出来的程序语言名,来设置当前的语言环境。
No Comments