用C来开发一个应用,我们不可避免会产生一些错误.有些错误,编译时,编译器便会提示我们.而有些运行时的错误,由于在运行时才会出现,很难诊断.比如常见的Segment Fault错误.我现在在开发一个HTTP服务器时,最常见的就是这个错误.通常来说,只会给你上面那么一个错误提示.这样的话,我们往往不明所以.但是,有了gdb,这一切都So easy.
这篇文章,便初步介绍了如何使用gdb来调试一个应用.但是,gdb本身也是一个很复杂的工具,所以,我们还需要查询其他的资料,来了解并掌握gdb的使用方法.
在这篇文章中,我们将分六步,来介绍gdb的使用.
写一个调试用的C程序
我们写了一个用于求阶乘的程序.但是,这个程序中含有一些错误.我们将在后面调试这些错误.
用-g选项编译这个C程序
-g选项表明允许编译器来收集调试信息.
上面的命令会创建一个用于调试的C程序.
用gdb加载这个应用程序
使用下面的命令来加载一个应用.
设置断点
设置断点还有其他的格式:
- break [file_name]:line_number
- break [file_name]:func_name
将断点设置在你要调试的地方.当程序执行到这个地方,就会自动停止,并输出一些能够帮助你进行调试的信息.
在启动要调试的程序之前,我们先设置断点:
在gdb中启动要调试的程序
我们可以在gdb中通过run命令,来启动被调试的程序.我们也可以设置参数,但是因为我们的程序不需要传入参数,所以这里我们没有设置.
程序会自动运行到断点,然后停止,然后输出调试信息:
打印变量的值
从上图中可以看到,因为我们没有为j这个变量赋初值,所以它获得了一个随机值.
我们为j赋初值1.然后重新编译程序.
你可以看到,即使我们修复了程序中的错误,执行起来仍然有错误.
我们先在第十行设置断点,然后执行后面的操作.
Continue, stepping over and in – gdb commands
当程序停在断点处时,我们可以执行下面三条命令中的一条:
- continue: 执行到下一个断点处
- next: 执行下一条语句
- step:和next类似,但是不会跳过函数.即如果下一条语句中,包含一个函数,则会进入到这个函数内部.
通过执行continue或者step,我们可以发现程序还有问题是因为我们的循环终止的条件不正确.把<修改成>即可.
gdb命令缩写
下面几个是我们最常用的命令,及他们的缩写:
- list的缩写是其首字母l
- print的缩写是其首字母p
- continue的缩写是其首字母c
- step的缩写是其首字母s
- 执行ENTER,会再次执行上面执行的最后一条命令
其他gdb命令
- list命令: 这条命令用于打印源代码,我们可以通过加上行数这个参数来查看指定的一行,或者加上函数名这个参数来查看指定的函数.
- backtrack命令: 打印栈.
- help命令: 查看都有什么命令,以及命令的具体用法.
- quit: 退出gdb调试器
原文链接
http://www.thegeekstuff.com/2010/03/debug-c-program-using-gdb