文章目录
- GDB常用命令表
- GDB使用
- 一.启动GDB
- 二.运行程序
- 三.设置和显示参数
- 四.查看源代码
- 五.查看变量及变量类型
- 查看变量
- 查看变量类型
- 六.断点
- 1.设置断点
- 2.查看断点
- 3.删除断点
- 4.禁止/允许断点
- 5.清除断点
- 六.单步调试
- 七.设置监测点
- 八.调用路径
- 九.退出GDB
GDB常用命令表
GDB命令 | 格式 | 含义 | 简写 |
list | list line1,line2 | 列出文件的代码 | l |
print | print p | 打印变量内容 | p |
break | break [行号或函数名称] | 设置断点 | b |
continue | continue[开始,结束] | 继续运行 | c |
info | info para | 列出信息 | i |
next | next | 下一行 | n |
step | step | 进入函数 | S |
display | display para | 显示参数 | |
file | file path | 加载文件 | |
run | run | 运行程序 | r |
GDB使用
一.启动GDB
要用GDB调试程序,需要在程序编译时添加-g,假如有一个文件名为test.c,需要对它进行调试,则需要使用以下命令生成一个可调试的可执行文件
$gcc -o test test.c -g
如上,有一个可调试的程序test后,需要使用GDB加载程序,主要有以下两种方法:
1.使用 “gdb 程序名”
$ gdb test
/*********gdb界面*********/
Reading symbols from /home/csr/Documents/dir/test...done.
2.使用gbd命令进入界面后,使用 “file 程序名”
$gbd
/*********gdb界面*********/
(gdb) file test
Reading symbols from /home/csr/Documents/dir/test...done.
二.运行程序
加载完成后,如果要运行准备好的程序,可以使用run程序,run程序后跟传递给程序的参数。
(gdb) run
Starting program: /home/csr/Documents/dir/test
hello world[Inferior 1 (process 7871) exited normally]
三.设置和显示参数
使用set args命令来设置发送给程序的参数;使用show args命令可以查看其默认的参数。
(gdb) args 3
(gdb) show args
Argument list to give program being debugged when it is started is "3".
四.查看源代码
使用list(简写l)可以打印文件代码,命令格式为
list line1,line2
该命令打印从line1到line2之间的代码。如果不输入参数则从当前行开始打印,默认一次打印10行
(gdb) list 2,5
2
3 int main()
4 {
5 printf("hello world");
五.查看变量及变量类型
查看变量
print(简写p)命令可以打印变量或表达式的值。其可以打印任何有效的表达式的值和变量值,格式为:
(gdb) print var //(var为参数)
//打印常量表达式的值
(gdb) print 3+2
$1 = 5
//打印保存在全局变量中的历史值
(gdb) print $1
$2 = 5
此外,print可以打印调用函数的返回值、结构中的各成员值。
还可以使用print打印构造数组的值,给出数组指针头并设置要打印的结构数量,print命令会依次打印。格式为
(gbd)print 基地址@个数
例如,有如下结构
struct temp{
int a;
int b;
};
*io为结构temp的头,则以下例子打印从io开始的两个数据结构
(gdb) p *io@2
查看变量类型
查看变量类型主要使用两个命令:whatis、ptype
- whatis
该命令可以查看变量的类型,该命令的格式为"whatis 变量名",其中变量名是要查看的变量,
例如
(gdb) whatis io
type = struct temp *
- ptype
该命令可以查看结构的详细定义,格式为"ptype 变量名",与whatis相比,它能得到变量的详细信息。例如
(gdb) ptype io
type = struct temp {
int a;
int b;
} *
(gdb) ptype *io
type = struct temp {
int a;
int b;
}
六.断点
1.设置断点
使用break设置断点,简写为b。有如下几种形式,注意,GDB的停止位置都是在执行程序行之前。
- break 行号:程序停止在设定的行前
- break 函数名:程序停止在设定的函数前
- break 行号或者函数 if条件:条件断点设置命令,如果条件为真则到达指定行或函数时停止。
(gdb) break 3
Breakpoint 1 at 0x400531: file test.c, line 3.
(gdb) run
Starting program: /home/csr/Documents/dir/test
Breakpoint 1, main () at test.c:5
5 printf("hello world");
(gdb) break 2 if 1
Note: breakpoint 1 also set at pc 0x400531.
Breakpoint 2 at 0x400531: file test.c, line 2.
2.查看断点
对于设置过的断点,可以使用info break查看
(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000000000400531 in main at test.c:3
breakpoint already hit 1 time
2 breakpoint keep y 0x0000000000400531 in main at test.c:2
stop only if 1
以上信息中,Num为断点编号,Type是信息的类型,Disp是描述,Enb说明断点是否有效,Address是断点在内存中的地址,What是对断点在源文件中位置的描述。
breakpoint already hit 1 time 表示已经命中了一次断点
3.删除断点
删除断点使用命令delete,格式为“delete breakpoint 断点编号”。
例如,以下语句删除第二个断点:
(gdb) delete breakpoint 2
(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000000000400531 in main at test.c:3
breakpoint already hit 1 time
如果不带断点编号,将删除所有断点
4.禁止/允许断点
禁止某个断点使用命令disable,相对的运行某个断点使用命令enable,格式如下:
(gdb) disable b 断点编号
(gdb) enable b 断点编号
使用此命令会改变断点信息中的Enb
5.清除断点
一次性清除某行的所有断点使用命令clear,这个命令将清除某行的所有断点信息。使用clear清除某行的断点后,GDB将不再保存这些断点的信息,必须重新设置断点
(gdb) clear 行号
六.单步调试
在调试时常常遇到要单步跟踪的情况,并在适当时候进入函数体内部继续跟踪。GDB的next和step命令提供了这种功能,next命令是单步跟踪的命令,简写为n;step是可以进入函数体的命令,简写为s。如果已进入某个函数,想退出函数返回到调用的函数中,则使用命令finish。
七.设置监测点
命令dispaly可以显示某个变量的值,在结束或遇到断点时,将设置变量的值显示出来。display只显示作用域内变量的值。
(gdb) display io
1: io = (struct temp *) 0x602010
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/csr/Documents/dir/test
Breakpoint 1, main () at test.c:10
10 printf("hello world");
1: io = (struct temp *) 0x602010
八.调用路径
backtrace(简写bt)命令打印函数的调用路径,提供向前跟踪功能。该命令会打印一个顺序列表,显示函数从最近到最远的调用过程,包含调用函数和其中的参数。
九.退出GDB
输入q或者quit即可退出GDB
(gdb) quit
(gdb) q