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 版权协议,转载请附上原文出处链接和本声明。