Linux调试器-gdb使用

1. 背景

程序的发布方式有两种,debug模式和release模式
Linux gcc/g++出来的二进制程序,默认是release模式
要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项,生成debug模式的程序 

2. 开始使用

对源文件编译的时候加上-g选项,否则会提示没有调试符号


下面是对于debug版本程序的调试

gdb进入调试

注意:gdb会记录最近一条命令,如果命令无变化,可以直接回车 


q或quti:退出调试


l或list:显示出源代码,每次显示10行

(gdb) l 0
1	#include <stdio.h>
2	
3	int AddToTop(int top)
4	{
5	    int sum = 0;
6	    int i = 0;
7	    for (i = 0; i < top; i++)
8	    {
9	        sum += i;
10	    }
(gdb) 
11	    return sum;
12	}
13	
14	int main()
15	{
16	    int top = 100;
17	
18	    int ret = AddToTop(top);
19	
20	    printf("ret:%d\n", ret);
(gdb) 
21	
22	    return 0;
23	}
(gdb) 
Line number 24 out of range; test.c has 23 lines.

 指令l 0意为从代码第一行开始显示


r或run:开始调试

如果没有遇到断点就直接运行结束,并且每次都从最开始运行程序

 


b(breakpoint) 行号:给特定的行号打断点

(gdb) l 0
1	#include <stdio.h>
2	
3	int AddToTop(int top)
4	{
5	    int sum = 0;
6	    int i = 0;
7	    for (i = 0; i < top; i++)
8	    {
9	        sum += i;
10	    }
(gdb) 
11	    return sum;
12	}
13	
14	int main()
15	{
16	    int top = 100;
17	
18	    int ret = AddToTop(top);
19	
20	    printf("ret:%d\n", ret);
(gdb) 
21	
22	    return 0;
23	}
(gdb) b 16
Breakpoint 1 at 0x40056a: file test.c, line 16.
(gdb) b 18
Breakpoint 2 at 0x400571: file test.c, line 18.
(gdb) b 20
Breakpoint 3 at 0x40057e: file test.c, line 20.

info b:查看断点

(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x000000000040056a in main at test.c:16
2       breakpoint     keep y   0x0000000000400571 in main at test.c:18
3       breakpoint     keep y   0x000000000040057e in main at test.c:20

 Num表示的是断点的编号


d 断点编号:删除断点

(gdb) d 1
(gdb) d 2
(gdb) d 3
(gdb) info b
No breakpoints or watchpoints.

n:逐过程开始调试

需要先打一个断点然后用r进入到调试模式


p 变量名:打印变量内容

要确保变量没有被销毁才能打印出来 

(gdb) p ret
$5 = 4950

s:逐语句,遇到函数会进入到函数内部

 


bt:查看当前的调用堆栈 

(gdb) bt
#0  AddToTop (top=100) at test.c:7
#1  0x000000000040057b in main () at test.c:18

finish:将当前函数跑完,就停下来

(gdb) finish
Run till exit from #0  AddToTop (top=100) at test.c:7
0x000000000040057b in main () at test.c:18
18	    int ret = AddToTop(top);

display :设置常显示

每调试一步都会将设置了常显示的变量的值给显示出来

 


undisplay:取消设置常显示 

(gdb) undisplay 
Delete all auto-display expressions? (y or n) y

 until:跳转到指定行

 


c:运行至下一个断点处就停下来 

 


disable/enable 断点编号:关闭和打开断点

(gdb) disable 2

set var:设置变量的值

(gdb) set var top
warning: Expression is not an assignment (and might have no effect)
(gdb) set var top=80
(gdb) p top
$3 = 80

 

  • 17
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闻 术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值