如何使用gdb来调试一个应用-(译)

Posted by AlstonWilliams on February 17, 2019

用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