1.GDB 介绍
GDB(the GNU Project Debugger)是 GNU 发布的一个功能强大的 UNIX 程序调试工具,可以调试 Ada、 C、 C++、 Objective-C 和 Pascal 等多种语言的程序,可以在大多数 UNIX 和Microsoft Windows 变种上运行。 GDB 既可以在本地调试,也可以进行远程调试,这里主要记录本地调试的笔记,远程调试将会在下一篇进行说明。
GDB 可以在命令行下启动,通过命令行对程序进行调试; GDB 也有自己的图形前端,如 DDD。无论通过何种方式启动 GDB,通过 GDB 能够对程序进行如下调试:
● 运行程序,还可以给程序加上某些参数,指定程序的行为。
● 使程序在特定的条件下停止。
● 检查程序停止时的运行状态。
● 改变程序的参数,以纠正程序中的错误
2. GDB 基本命令
需要使用 GDB 调试的程序,在编译的时候必须加-g 参数,开启调试信息。运行 GDB,调试程序通常使用如下方式:
命令 | 功能描述 |
break | 设置断点:break + 要设置断点的行号 |
clear | 清除断点:clear + 要清除断点的行号 |
delete | 用于清除断点和自动显示的表达式的命令 |
disable | 让所设断点暂时失效 |
enable | 与disable相对 |
run | 运行调试程序 |
continute | 继续执行正在调试的程序 |
next | 执行一行代码,但不进入函数内部 |
step | 执行一行代码,而且进入函数内部 |
list | 列出源代码的一部分 |
print + 变量名:输出该变量名的值 | |
watch | watch + 变量名:监视一个变量的值 |
quit | 退出 |
kill | 终止调试程序 |
3.GDB 调试范例
编写hello_error.c,这里取名error,是因为这是一个bug的源文件
#include <stdio.h>
int *p = NULL;
void hello_print(void)
{
printf("hello world");
}
int main(int argc,char *argv[])
{
hello_print();
*p = 10;//error
return 0;
}
1.编译输出带调试信息的可执行文件,这个文件通常会比一般情况下生成的可执行文件的大,因为-g 输出的文件是包含很多调试参数在里面。
gcc -g hello_error.c -o hello_error1
gcc hello_error.c -o hello_error2
2.我们先运行一下hello_error1
./hello_error1
从调试信息中我们发现,出现内存段错误,原因是我们给指针p赋值,这个是指针是野指针,指向的是0地址,现在我们给0地址赋值,所以出现了错误。
我们使用gdb来调试这个程序:
gdb hello_error1
输入help,可查看相应的帮助信息。
输入 run 命令,开始调试程序
然后就停止在了错误的地方
我们也可以输入where命令,来定位问题:
很明显在源文件14行出现了问题
我们输入list命令,查看下源文件代码
我们先在13行打个断点 break 13,然后输入run,重新运行,然后程序就会运行到第13行,停止
然后输入step,进入hello_print函数体,然后在输入next,执行下一步,输出hello world
打印输出p
print p
给非法地址赋值,导致段错误