Linux调试器-gdb使用

  • Post author:
  • Post category:linux


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



版权声明:本文为l_shadow_m原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。