不得不说,GDB确实是个调试神器,当你对它了解越加深入之后,你将会发现以前很麻烦的调试过程变得如此简单了!下面我们先来看一些基本的GDB调试指令:
#include <cstdio>
using namespace std;
int main()
{
int sum = 0;
for (int i = 0; i < 100; i++) {
sum += i;
}
printf("The sum of 1 - 100 is %d!\n", sum);
return 0;
}
在vim中键入上述代码,然后使用g++调试指令生成对应的可执行文件:
g++ -Wall -g -o test test.cpp
注意:此处必须加入-g选项,保证可执行文件中有调试信息。之后,我们就可以使用指令:gdb + 相应可执行文件名,进行调试了。例如:上文中生成的test文件,gdb test。输入之后我们就进入了gdb中,下面我将给出一张GDB的一些基本指令表供查阅:
r | run | 运行 |
c | cuntinue | 运行到下一断点处 |
q | quit | 退出gdb |
tab | tab | 命令补全 |
h | help | 帮助功能 |
s | step | 跟入函数 |
n | next | 执行到下一行,函数调用作为一行处理 |
break | break | 添加断点 |
info break | info break | 查看断点数 |
del | delete | 删除断点 |
l | list | 列出代码,一次仅列出10行 |
watch | watch | 观察变量值,每次中断都将显示该值 |
what | what | 显示变量类型 |
p | 打印一变量值 | |
start | start | 从主函数main开始运行调试 |
fin | finish | 运行直至当前函数返回 |
下面,我们就来说说如何在调试中加入断点,观察相应变量或表达式的值等的操作:
断点在调试启动前添加(即键入r之前),Linux下的gdb调试并不会像Windows下各种IDE一般,需要哪行代码加断点,点一下就行。Linux下的gdb无界面,为了更清楚地找到需要添加断点的位置,我们需要先执行一个l指令(list的缩写)!注意:l仅能列出10行代码,如果我们的代码超过了10行,则需要多次执行l,但我们并不需要再次键入,只需连按回车键就行,当gdb无输入时,连续回车则执行上一次的指令。列出所有代码之后,我们可以通过如下指令添加断点:
break 行数
break 文件名:行数
接下来就该观察相应变量或表达式的值了吧,watch指令可以对某一变量进行观察,但watch指令必须在程序运行之后(即r指令执行之后),watch使用方法如下:
watch 变量名或表达式名
如此,在每一次程序中断时,我们就能看到变量或表达式此时的值了。至于运行到下一断点,键入c指令即可,此时就像VS里的F5,CodeBlocks里的F8了。