ubantu中的 GDB调试
1、GDB命令
命令 | 作用 |
---|---|
file | 装入想要调试的可执行文件。 |
kill | 终止正在调试的程序。 |
list | 列出产生执行文件的源代码的一部分。 |
next | 执行一行源代码但不进入函数内部。 |
step | 执行一行源代码而且进入函数内部。 |
run | 执行当前被调试的程序。 |
c | 继续运行程序。 |
quit | 终止gdb。 |
watch | 使你能监视一个变量的值而不管它何时被改变。backtrace栈跟踪,查出代码被谁调用。 |
查看变量的值。 | |
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 |
2、GDB调试举例
下面的代码实现对一个整型数的反转功能,比如输入123,则输出321。但输入100时,程序的输出结果却不正确,请找出问题。
1、建立一个文件
vi gdbtiaoshi.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);
}
3、用gcc生成可执行代码,并执行查看程序执行结果
gcc -o gdbtiaoshi gdbtiaoshi.c
./gdbtiaoshi
由程序运行结果可以看出,输入563,则输出365。但输入100时,程序的输出结果却不正确。下面我们用GDB命令来调试程序,检查。
4、用GDB命令对程序进行调试
由上图的单步调试可知,当iNum=10时,iNum不会再进入函数的循环,而是直接输出,造成输出结果与预期不同。按照要求,当iNum=10依旧进入循环。
5、修改gdbtiaoshi.c的循环条件为while(iNum>=10)
修改前退出gdb调试
quit
修改程序:
6、重新编译、运行程序
输出成功
总结:
在Ubuntu下进行GDB调试,提供了一种寻找程序漏洞的方式,可以让我们更快更好地找到程序错误的地方,提高编程效率。