`

GDB调试技巧

阅读更多
checkpoint是程序在那一刻的快照,当我们发现错过了某个调试机会时,可以再次回到checkpoint保存的那个程序状态。
 
举例说明一下:
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. static int func()
  4. {
  5.     static int i = 0;
  6.     ++i;
  7.     if (i == 2) {
  8.         return 1;
  9.     }
  10.     return 0;
  11. }
  12. static int func3()
  13. {
  14.     return func();
  15. }
  16. static int func2()
  17. {
  18.     return func();
  19. }
  20. static int func1()
  21. {
  22.     return func();
  23. }
  24. int main()
  25. {
  26.     int ret = 0;
  27.     ret += func1();
  28.     ret += func2();
  29.     ret += func3();
  30.     return ret;
  31. }
当我们执行这个程序时,发现程序返回1,不是期望的成功0。于是开始调试程序,由于函数调用的嵌套过多,我们没法一眼看出是main中的哪个函数调用出错了。于是在ret += func1()前,我们保存一个checkpoint。
  1. (gdb) b main
  2. Breakpoint 1 at 0x80483e0: file test.c, line 31.
  3. (gdb) r
  4. Starting program: /home/fgao/works/test/a.out
  5. Breakpoint 1, main () at test.c:31
  6. 31 int ret = 0;
  7. Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.i686
  8. (gdb) n
  9. 33 ret += func1();
  10. (gdb) checkpoint
  11. checkpoint: fork returned pid 2060.
  12. (gdb)
然后使用next步进,并每次调用完毕,打印ret的值
  1. Breakpoint 1, main () at test.c:31
  2. 31 int ret = 0;
  3. (gdb) n
  4. 33 ret += func1();
  5. (gdb) checkpoint
  6. checkpoint: fork returned pid 2060.
  7. (gdb) n
  8. 34 ret += func2();
  9. (gdb) p ret
  10. $4 = 0
  11. (gdb) n
  12. 35 ret += func3();
  13. (gdb) p ret
  14. $5 = 1
结果发现,在调用func2()调用后,ret的值变为了1。可是此时,我们已经错过了调试func2的机会。如果没有checkpoint,就需要再次从头调试了——对于这个问题从头调试很容易,但是对于很难复现的bug可就不说那么容易的事情了。
 
ok,使用checkpoint恢复
  1. (gdb) restart 1
  2. Switching to process 2060
  3. #0 main () at test.c:33
  4. 33 ret += func1();
  5. (gdb)
很简单,现在GDB恢复到了保存checkpoint时的状态了。上面“restart 1“中的1为checkpoint的id号,可以使用info查看。
  1. (gdb) info checkpoints
  2. * 1 process 2060 at 0x80483e7, file test.c, line 33
  3.   0 process 2059 (main process) at 0x80483f7, file test.c, line 35
 
从上面可以看出checkpoint的用法很简单,但是很有用。就是在平时的简单的bug修正中,也可以加快我们的调试速度——毕竟减少了不必要的重现bug的时间。

 

分享到:
评论

相关推荐

    100个gdb调试技巧-高清书签版

    这本书《100个gdb调试技巧-高清书签版》显然是为了帮助开发者深入学习和掌握GDB的高级技巧。 从提供的文件内容来看,这本书包含了大量关于GDB的实用技巧,覆盖了GDB的多个方面。以下是一些关键点的展开: 1. GDB...

    GDB--gdb调试.pdf

    本文将基于给定的"GDB--gdb调试.pdf"文件内容,深入解析GDB的基本概念、使用方法及高级功能,帮助读者快速掌握GDB调试技巧。 ### GDB概览 GDB是GNU项目的一部分,由Richard Stallman、Roland Pesch、Stan Shebs等...

    Linux gdb常用调试技巧

    Linux gdb 调试技巧 在本文中,我们将总结 GDB 调试过程中的一些重要细节,并提供了一些有用的调试技巧。 启动 GDB GDB 提供了两种方式来启动调试: 1. 启动 Core 文件:`gdb &lt;program&gt; core` 2. 附加到已运行的...

    STM32 GDB调试手册

    该手册涵盖了 GDB 的基本概念、使用方法、调试技巧等内容,是 STM32 开发者的必备指南。 描述解释 本手册是 STM 官方提供的 STM32 调试指南,旨在指导开发者使用 GDB 调试 STM32 微控制器。该手册详细介绍了 GDB 的...

    gdb调试常用命令及调试例子

    在IT行业中,调试是开发过程中的重要环节,用于找出并修复...总之,熟练掌握GDB调试技巧,能极大地提高程序员的效率,减少bug的生命周期,确保软件质量。通过实践和学习,你将能够运用这些命令解决各种复杂的调试问题。

    linux 使用GDB调试 资料

    总之,Linux下的GDB调试技巧对于任何开发者来说都是必备技能,无论是在排查复杂问题还是优化代码性能方面,都能发挥巨大作用。通过深入学习和实践,你将能够熟练运用GDB解决各类编程挑战。这份"Debug with GDB"的...

    使用GDB调试多线程实例详解

    gdb test 进入调试 需要调试的地方打下断点,run运行到断点处。 r 运行到断点处,info thread可以查看被调试的线程。 thread apply all bt 让所有线程打印堆栈信息 set scheduler-locking off|on|step 在使用...

    嵌入式gdb调试core

    ### 嵌入式GDB调试Core文件详解 在嵌入式系统开发过程中,经常会遇到程序出现异常的情况。为了能够定位这些异常发生的原因并进行修复,开发者通常会借助于调试工具...希望本文能够帮助您更好地理解和掌握GDB调试技巧。

    GDB调试程序[陈皓]&GDB调试工具指南

    《GDB调试程序[陈皓]》与《GDB调试工具指南》这两份PDF文档,是深入了解和精通GDB(GNU Debugger)这一强大调试工具的重要参考资料。GDB是开源世界中广泛使用的C、C++以及其他多种语言的调试器,它允许开发者在运行...

    用GDB调试程序(整理有书签).pdf

    陈浩的《用GDB调试程序》和守望的个人博客的《GDB调试指南》这两份资料,提供了丰富的实践案例和详细的操作步骤,帮助读者从基础到进阶掌握GDB的使用技巧。通过阅读这些教程,你可以了解如何有效地使用GDB解决实际...

    GCC中GDB调试小结

    ### GCC中的GDB调试技巧与心得 #### GDB简介 GDB(GNU调试器)是一款强大的开源调试工具,主要用于调试C、C++等语言编写的程序。它支持多种操作系统,并且能够帮助开发者深入理解程序的运行流程,快速定位并修复bug...

    gdb调试方法.rar

    通过深入学习和实践这些GDB调试技巧,开发者可以更加高效地定位和修复程序中的问题,提高代码质量和软件可靠性。记得结合“gdb调试方法.txt”文件中的具体示例和实践操作,以便更好地理解和掌握GDB的使用。

    gdb常用调试技巧收集

    以下是一些`gdb`常用的调试技巧: 1. **启用gdb调试** - **启动core**:当你有一个程序崩溃并产生了核心转储文件(core dump),你可以用`gdb &lt;program&gt; core`命令来调试,其中`&lt;program&gt;`是导致core dump的程序,...

    用GDB调试程序.pdf

    ### GDB调试技巧详解 #### GDB:Unix下的强大调试工具 GDB,全称GNU Debugger,是由GNU项目开发的一款开源、免费的程序调试工具,主要用于Unix及其类操作系统上进行软件开发。它提供了丰富的功能,使得开发者能够...

    Linux下gdb调试工具指南

    ### Linux下gdb调试工具指南:深入解析与实践 #### 引言 在软件开发领域,尤其是对于系统级编程和复杂应用的维护,一个高效、功能全面的调试工具是不可或缺的。GNU调试器(GDB)正是这样一款强大的调试工具,它...

    GDB调试参考手册

    总结来说,“GDB调试参考手册”提供了全面、深入的指南,不仅涵盖了GDB基础功能,也介绍了高级调试技巧,对从事软件开发和调试的专业人员来说是宝贵的参考资料。通过熟悉这些内容,开发者能够更加有效地使用GDB来...

Global site tag (gtag.js) - Google Analytics