这篇文章通过一个简单的实例描述了gdb的基本用法,并对gdb支持的语言极其基本选项进行了介绍。对于有一定经验的建议看下一篇文章:《gdb调试之实用技巧篇》
1. gdb介绍
gdb是GNU发布的一款功能强大的程序调试工具,它可以让我们深入洞悉一个程序是怎么运行的,也可以帮我们记录一个程序在崩溃的时候所执行的操作。具体一点它可以帮我们完成下面四件事情:
- 启动我们的程序,并指定任何可以影响程序执行的条件。
- 设置断点,让我们的程序停止在某处,然后查看堆栈是否正常。
- 追踪程序出错时执行的代码。
- 在程序运行中,调整参数,以测试潜在的bug。
就具体调试方法而言,根据使用场景不同,gdb调试可分为三种类型:
- 调试一个可执行文件
- 调试一个coredump文件
- 调试一个正在运行的进程
2. 一个简单的实例
实际应用的时候,遇到的情况可能是千差万别的,也远比下面所要举的例子更加复杂和困难。这里先针对gdb三种调试类型的前两种举一个简单的实例,以期带你走进gdb的调试世界。下面的测试代码,先从终端输入两个字符串,然后再将其输出到终端。
编译执行
编译上面的代码并执行,结果发现程序的输出结果不对,输入给b的内容本来是”01234”,但是输出的时候却变成了”ghijk”,而且发生了core dump(这里省略了glibc输出的memory map信息)。如下所示:
调试可执行文件
可执行文件的调试参考附录A,从中我们知道字符串a的赋值后,b也被改变了。因为给a赋值的时候超过了给a开辟的空间长度。
调试coredump文件
调试core文件的命令格式为:gdbPROGRAM CORE。根据gdb调试core文件的信息,可以知道发生core dump时程序正在执行的操作为test.c中的第18行代码,即free操作。
综合上述信息,可知道b的输出错误是因为a赋值越界引起的,而产生coredump的原因是free出错。至于为什么free出错,其实也是因为a