Linux调试器-gdb使用

安装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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值