安装gdb
sudo yum install gdb
gdb用法
我们先创建两个文件,用来测试gbc
[wws@hcss-ecs-178e ~]$ ll
total 36
-rw-rw-r-- 1 wws wws 336 Sep 12 19:26 code.c
-rw-rw-r-- 1 wws wws 69 Sep 12 19:32 makefile
code.c
makefile
release debug
debug版本:程序本身会被加入更多的调试信息,以便于进行调试。
release版本:不会添加任何调试信息,是不可调试的。
在Linux当中gcc/g++默认生成的可执行程序是release版本的,是不可被调试的。如果想生成debug版本,就需要在使用gcc/g++生成可执行程序时加上-g选项。[wws@hcss-ecs-178e ~]$ make gcc -o myexe-debug code.c -g [wws@hcss-ecs-178e ~]$ ll total 36 -rw-rw-r-- 1 wws wws 336 Sep 12 19:26 code.c drwxrwxr-x 2 wws wws 4096 Sep 12 19:16 dir1 -rw-rw-r-- 1 wws wws 69 Sep 12 19:32 makefile -rwxrwxr-x 1 wws wws 8440 Sep 12 19:26 myexe -rwxrwxr-x 1 wws wws 9672 Sep 12 19:32 myexe-debug
生成myexe文件没有加-g选项,发布的是release版本。可以看到myexe-debug的debug版本内存更大,要包含调试信息。
不包含调试信息不能用gbc调试。
gdb命令
1.l 显示文件代码
list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
list/l 函数名:列出某个函数的源代码。
(gdb) l 5 //l+行号
1 #include <stdio.h>
2 int Sum(int s, int e)
3 {
4 int sum = 0;
5 int i = s;
6 for(; i <=e; i++)
7 {
8 sum += i;
9 }
10
(gdb) l main //l+函数名
9 }
10
11 return sum;
12 }
13 int main()
14 {
15 printf("process is running\n");
16 int start = 1;
17 int end = 100;
18 int result = Sum(start, end);
(gdb) //gdb记录最近一次命令,回车再次执行
19 printf("process is done, result: %d\n", result);
20 return 0;
21 }
2.r 运行程序
r或run:运行程序。
(gdb) r
Starting program: /home/wws/myexe
process is running
process is done, result: 5050
[Inferior 1 (process 12399) exited normally]
Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.3.x86_64
3.b打断点 d删除断点 info b查看断点
break(b) 行号:在某一行设置断点
break 函数名:在某个函数开头设置断点info break :查看断点信息。
delete breakpoints:删除所有断点
delete breakpoints n:删除序号为n的断点
(gdb) b 1 //b 行号
Breakpoint 1 at 0x400587: file code.c, line 1.
(gdb) b 2
Note: breakpoint 1 also set at pc 0x400587.
Breakpoint 2 at 0x400587: file code.c, line 2.
(gdb) b main //b 函数名
Breakpoint 3 at 0x4005b5: file code.c, line 15.
(gdb) info b //查看所有断点
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000000000400587 in Sum at code.c:1
2 breakpoint keep y 0x0000000000400587 in Sum at code.c:2
3 breakpoint keep y 0x00000000004005b5 in main at code.c:15
(gdb) d 1 //d 1 删除断点
(gdb) info b
Num Type Disp Enb Address What
2 breakpoint keep y 0x0000000000400587 in Sum at code.c:2
3 breakpoint keep y 0x00000000004005b5 in main at code.c:15
4.enable启用断点 disable禁用断点
disable breakpoints:禁用断点
enable breakpoints:启用断点
(gdb) info b
Num Type Disp Enb Address What
2 breakpoint keep y 0x0000000000400587 in Sum at code.c:2
3 breakpoint keep y 0x00000000004005b5 in main at code.c:15
(gdb) disable 2
(gdb) info b
Num Type Disp Enb Address What
2 breakpoint keep n 0x0000000000400587 in Sum at code.c:2
3 breakpoint keep y 0x00000000004005b5 in main at code.c:15
5.n 逐过程F10 s逐语句F11
n 或 next:单条执行。
s或step:进入函数调用
(gdb) r
Starting program: /home/wws/myexe
Breakpoint 3, main () at code.c:15
15 printf("process is running\n");
(gdb) n
process is running
16 int start = 1;
(gdb) s
17 int end = 100;
6.dispaly监视 undisplay取消监视 p打印变量值
display 变量名:跟踪查看一个变量,每次停下来都显示它的值
undisplay:取消对先前设置的那些变量的跟踪p 变量:打印变量值
6 for(; i <=e; i++)
(gdb)
8 sum += i;
(gdb)
6 for(; i <=e; i++)
(gdb)
8 sum += i;
//监视 i sum
(gdb) display i
1: i = 6
(gdb) display sum
2: sum = 15
(gdb)
(gdb) s
6 for(; i <=e; i++)
2: sum = 21
1: i = 6
(gdb)
8 sum += i;
2: sum = 21
1: i = 7
(gdb)
6 for(; i <=e; i++)
2: sum = 28
1: i = 7
(gdb)
8 sum += i;
2: sum = 28
1: i = 8
// 取消监视
(gdb) undisplay 1
(gdb) undisplay 2
(gdb) s
6 for(; i <=e; i++)
(gdb) s
8 sum += i;
(gdb) s
6 for(; i <=e; i++)
//打印值
(gdb) p sum
$1 = 45
(gdb) p i
$2 = 9
7.until 跳转
until X行号:跳至X行
(gdb) until 12
Sum (s=1, e=100) at code.c:12
12 }
(gdb) p sum
$3 = 5050
补充:cgdb
安装:sudo apt-get install cgdb
可以分屏看代码
8.c 跳到下一个断点
continue(或c):从当前位置开始连续而非单步执行程序
9.finish 结束调用函数
finish:执行到当前函数返回,然后挺下来等待命令
10.info locals 自动监视
info(i) locals:查看当前栈帧局部变量的值
(gdb) info locals
start = 1
end = 100
result = 32767
a = -6656
b = 0
11.watch 监视变量值是否变化
watch i 当i值变化时编译会在此停下来。
置条件监视点
如果你只希望在某些条件下监视变量的变化,可以指定条件。
例如,仅在
x
的值大于 10 时停止:watch x if x > 10
12.set var 变量=_ 在运行在改变变量值
13. b n if x==y 条件断点
n代表断点处,可以是行号也可以是函数名。
condition _ x==y 给已存在断点添加条件
_处填第几个断点,不用写if.