GDB基础学习
- 要调试C/C++程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的-g参数可以做到这一点,比如:
gcc -g test.c -o test
GDB 的命令概貌
使用help命令
- 通过
gdb test
启动gdb后,就进入了gdb的调试环境,就可以使用gdb 的命令开始调试程序了,gdb的
命令可以使用help命令来查看:
-
这里可以看到help命令只是列出了gdb命令的种类,如果要知道所有的命令可以输入
help all
,也可以通过help <class>
查看种类中的命令,或通过help <command>
查看命令的帮助。 -
比如我们可以通过
help breakpoints
来查看断点的命令:
- 『需要注意』:gdb中的命令可以简写,如设置断点的break可以简写为b(当然,命令的前几个字符要标志着唯一的命令);在linux下,可以敲击两次TAB键来补齐命令的 全称,如果有重复的,gdb会把其列出来。比如输入b敲击两次TAB键:
基本命令
命令 | 解释 | 示例 |
---|---|---|
List(l) | 列出文件的代码清单 | (gdb) l |
Printf(p) | 显示指定变量(临时变量或全局变量)的值。 | (gdb) p i (gdb) p nGlobalVar |
Run(r) | 运行被调试的程序。如果此前没有下过断点,则执行完整个程序;如果有断点,则程序暂停在第一个可用断点处。 | (gdb) r |
Continue(c) | 继续执行被调试程序,直至下一个断点或程序结束。 | (gdb) c |
Breakpoint(b) | 1.函数断点: 在进入指定函数时停住。 2.行断点:在指定行号停住。 3.条件断点:break ... if 4.临时断点:(tb 行号) |
(gdb) b main (gdb) b 8 (gdb) b if i=100 (gdb) tb 15 |
Step(s) | 执行一行源程序代码,如果此行代码中有函数调用,则进入该函数; 相当于其它调试器中的“Step Into (单步跟踪进入)”。 |
(gdb) s |
Next(n) | 执行一行源程序代码,此行代码中的函数调用也一并执行; 相当于其它调试器中的“Step Over (单步跟踪)”。 |
(gdb) n |
Info(i) | 显示各类信息 | (gdb) i r |
Backtrace(bt) | 打印函数调用堆栈 | (gdb) bt |
Quit(q) | 退出gdb调试 | (gdb) q |
实例学习
我们用下面的代码来学习:
#include <stdio.h>
int func(int n)
{
int sum=0,i;
for(i=0; i<n; i++)
{
sum+=i; 9
}
return sum;
}
main()
{
int i;
long result = 0;
for(i=1; i<=100; i++)
{
result += i;
}
printf("result[1-100] = %d
", result );
printf("result[1-250] = %d
", func(250) );
}
首先vim一个test.c,再输入gcc -g test.c -o test
进行编译,编译成功后输入gdb test
启动gdb进行调试:
输入l
列出源码,再敲击回车可以看到所有代码:
接下来在第16行通过b 16
设置断点;通过b func
在func函数处设置断点,info b
可以查看断点信息如图:
输入r
运行程序,会停到断点处;再输入n
单条语句执行,可以看到循环在一条一条执行;为了快速一点,输入c
直接把循环执行完:
我们也可以输入b 16 if i=50
来设置条件断点,run之后可以看到程序停到了断点处,此时printf i的值为50: