一、GDB简介
(一)介绍
GDB : GNU Debugger,GDB是GNU开发的一个Unix/Linux下强大的程序调试工具。GDB可以调试C、C++、Objective-C、Pascal、Ada等语言编写的程序。
(二)功能
1、启动你的程序,可以按照你的自定义的要求运行程序。
2、可让被调试的程序在你所设定的调置的断点处停住。
3、跟踪代码执行的过程,监视或修改程序中变量的值。
4、你可以改变你的程序,将一个BUG产生的影响修。
二、GDB相关命令
• file 装入想要调试的可执行文件。
• kill 终止正在调试的程序。
• list 列出产生执行文件的源代码的一部分。
• next 执行一行源代码但不进入函数内部。
• step 执行一行源代码而且进入函数内部。
• run 执行当前被调试的程序。
• c 继续运行程序。
• quit 终止gdb。 • watch 使你能监视一个变量的值而不管它何时被改变。
• backtrace 栈跟踪,查出代码被谁调用。
• print 查看变量的值。
• make 使你能不退出gdb就可以重新产生可执行文件。
• shell 使你能不离开gdb就执行UNIX shell命令。
• whatis 显示变量或函数类型。
• break 在代码里设断点,这将使程序执行到这里时被
挂起。
• info break 显示当前断点清单,包括到达断点处的次数等。
• info files 显示被调试文件的详细信息。
• info func 显示所有的函数名称。
• info local 显示当函数中的局部变量信息。
• info prog 显示被调试程序的执行状态。
• delete [n] 删除第n个断点。
• disable[n] 关闭第n个断点。
• enable[n] 开启第n个断点。
• ptype 显示结构定义。
• set variable 设置变量的值。
• call name(args) 调用并执行名为name,参数为args的函数。
• Finish 终止当前函数并输出返回值。
• return value 停止当前函数并返回value给调用者。
• break命令的使用
– 根据行号设置断点:
• (gdb) break linenum
– 根据函数名设置断点: • (gdb) break funcname
– 执行非当前源文件的某行或某函数时停止执行: • (gdb) break filename:linenum
• (gdb) break filename:funcname
– 根据条件停止程序执行: • (gdb) break linenum if expr
• (gdb) break funcname if expr
三、GDB具体使用
(一)编辑程序
1.使用vim创建文件,将代码输入。
vim example.c
2.源代码:
#include <stdio.h>
void ShowRevertNum(int iNum)
{
while (iNum > 10)
{
printf("%d", iNum % 10);
iNum = iNum / 10;
}
printf("%d\n", iNum);
}
int main(void)
{
int iNum;
printf("Please input a number :");
scanf("%d", &iNum);
printf("After revert : ");
ShowRevertNum(iNum);
}
代码实现对一个整型数的反转功能,比如输入123,则输出321但输入100时,程序的输出结果却不正确。
3.进入vim后,直接将程序代码粘贴即可(在下使用的ubantu18.04版本,如果不可以复制等功能,可以使用shell等工具或者用键盘输入,熟悉代码!),也可以使用自己的程序哟!退出时,按键盘上面“Esc”,再输入“:wq”,表示存储并退出。
(二)编译程序
1.使用gcc生成可执行代码。
gcc -o example example.c
2.执行程序。
./example
3.输入123和100对程序进行测试。
我们可以看到,输入123时,程序能够输出正确结果321,即将输入数字倒序,但是输入100的时候,输出结果为010,而我们却想得到001,所以程序有Bug!有的伙伴会说上述功能可以用数组实现,别急别急!咱先一步一步看完。
(三)调试程序
1.输入命令,进入调试。
gdb example
2.输入相关命令,并进行调试,可参照“GDB相关命令”进行调试哦,下面图片也有展示,大家可以参考。
在这里我们可以发现问题了,当iNum等于10之后便不再进入循环,但是我们需要包含10,才可以在100甚至1000…等这些相对比较特殊的数字实现倒序的功能,所以我们可以修改代码了!!!
4.可以使用命令退出GDB调试咯。
gdb qiut
(四)修改程序
1.用vim命令进入,编辑代码。
vim example.c
不是vim example,不然你将会看到一堆乱码。
2.将程序代码“while (iNum > 10)”修改为“while (iNum >= 10)”,具体代码如下展示(可以直接复制过去嗷)。
#include <stdio.h>
void ShowRevertNum(int iNum)
{
while (iNum >= 10)
{
printf("%d", iNum % 10);
iNum = iNum / 10;
}
printf("%d\n", iNum);
}
int main(void)
{
int iNum;
printf("Please input a number :");
scanf("%d", &iNum);
printf("After revert : ");
ShowRevertNum(iNum);
}
3.一定要再编译一下,再运行程序。
gcc -o example example.c
./example
4.输入100,测试结果,如下图所示:
四、总结
写程序代码,不经意间就出现了令人头大的Bug,有时候出错的地方不容被发现,通过GDB调试,可以一步一步根据需求观察数据变化,进行调试,是一个很实用的功能,不过熟悉需要一定的时间哦,大家冲冲冲!