一、常用进入gdb方法
1、gdb attach pid
调试系统中的一个服务程序。
2、gdb program core
调试program产生的core文件
二、断点
1、break function(函数名)//简写 b
2、break file:line(文件名:行号)//简写 b
3、info break (查看断点信息)
4、维护断点:
clear 后面跟函数或文件名:行号
enable 后面跟断点号
disable 后面跟断点号
三者什么都不跟,则操作所有的断点。
三、观察点
1、watch/rwatch/awatch [表达式或变量] (当表达式或变量发生变化/被读/被写时断到当前位置)
2、info watchpoints
四、恢复程序执行和
1、continue /c 运行程序
2、next/n 单步调试遇到函数不进入函数
3、step/s 单步调试遇到函数进入函数
五、信号
1、info handel 查看
2、handel SIG34 nostop noprint 由于在continue执行后,一些信号会打断执行,这个时候需要忽略改信号。
六、查看栈信息
1、info thread 查看所有线程当前语句
2、bt [n] 查看主线程调用栈可以跟整数也可以不跟,跟了就是打印几层(正n就是最后n层负n就是前面n层)
3、thread apply all bt 查看该进程所有的线程栈信息
4、info registers 查看寄存器地址
5、frame n 跳到第几层的栈
6、info frame 查看当前跳到第几层栈
7、info args 查看当前函数的参数
8、info locals 查看当前函数的局部变量
9、list function 查看函数源代码
10、list line 查看line行周围的源代码
七、查看运行时变量
1、print/p x 查看x值
2、输出格式 p/x i 查看i的16进制
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
3、p *array@len 查看数组(array首地址len长度)/p arr[i]也行
4、x/nfu addr 查看内存
{
n、f、u 是可选的参数。
n(the repeat count) 是一个正整数,默认为 1,表示从 addr 开始显示内存的长度(按照
units u 计数),也就是说从当前地址向后显示几个地址的内容。
f(the display format) 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式
可以是 s,如果地址是指令地址,那么格式可以是 i。默认是'x'(十六进制)
u(the unit size) 表示从当前地址往后请求的字节数,如果不指定的话,GDB 默认是 w(4 个
bytes)。u 参数可以用下面的字符来代替,b(Bytes)表示单字节,h(Halfwords)表示双字
节,w(Words)表示四字节,g(Giant word)表示八字节。当我们指定了字节长度后,GDB 会
从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。每次指定一个
unit size,在你下一次使用 x 命令时这个 size 将变成默认的 unit。
}
n/f/u 三个参数可以一起使用。例如:
命令 x/3uh 0x54320 表示,从内存地址 0x54320 读取内容,h 表示以双字节为一个单位,3
表示三个单位,u 表示按十六进制显示。
5、show print union 查看联合体
6、打开地址输出
set print address on
set print address off
show print address
7、打开数组显示,打开后当数组显示时,每个元素占一行,如果不打开的话,每个元素则以逗
号分隔。这个选项默认是关闭的。与之相关的两个命令如下,我就不再多说了
set print array on
set print array off
show print array
8、这个选项主要是设置数组的,如果你的数组太大了,那么就可以指定一个来指定数据显示的
最大长度,当到达这个长度时,GDB 就不再往下显示了。如果设置为 0,则表示不限制。
set print elements
show print elements
9、如果打开了这个选项,那么当显示字符串时,遇到结束符则停止显示。这个选项默认为off。
set print null-stop
10、pretty选项
set print pretty on
如果打开 printf pretty 这个选项,那么当 GDB 显示结构体时会比较漂亮。如:
$1 = {
a= 0x0,
b= {
c= 1,
d= 1
},
e= 0x54 "xx"
}
set print pretty off
关闭 printf pretty 这个选项,GDB 显示结构体时会如下显示:
$1 = {a = 0x0, b = {c = 1, d = 1}, e = 0x54 "xx"}
show print pretty
查看机构显示方式
11、字符显示开关
set print sevenbit-strings
设置字符显示,是否按“\nnn”的格式显示,如果打开,则字符串或字符数据按\nnn 显示,
如“\065”。
show print sevenbit-strings
12、设置显示结构体时,是否显式其内的联合体数据
set print union
设置显示结构体时,是否显式其内的联合体数据。例如有以下数据结构:
typedef enum {a, b} enum_a;
typedef enum {c,d, e} enum_b;
typedef enum {f, g, h}enum_c;
struct st_test {
enum_a a_en;
union {
enum_b b_en;
enum_c c_en;
} form;
};
struct st_test foo = {a, {c}};
当打开这个开关时,执行 p foo 命令后,会如下显示:
$1 = {a_en = Tree, form = {b_en =c , c_en = f}}
当关闭这个开关时,执行 p foo 命令后,会如下显示:
$1 = {a_en = Tree, form = {...}}
show print union
查看联合体数据的显示方式
八、设置运行时变量和调用函数
1、print/p x=10 设置变量的值
在某些时候,很有可能你的变量和 GDB 中的参数冲突,如:
(gdb) whatis width
type = double
(gdb) p width
$4 = 13
(gdb) set width=47
Invalid syntax in expression.
因为,set width 是 GDB 的命令,所以,出现了“Invalid syntax in expression”的设置错
误,此时,你可以使用 set var 命令来告诉 GDB,width 不是你 GDB 的参数,而是程序的变
量名,如:
(gdb) set var width=47
另外,还可能有些情况,GDB 并不报告这种错误,所以保险起见,在你改变程序变量取值
时,最好都使用 set var 格式的 GDB 命令。
2、call
call expr
表达式中可以一是函数,以此达到强制调用函数的目的。并显示函数的返回值,如果函数返
回值是 void,那么就不显示。