`

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调试技巧-高清书签版

    本书介绍了大量的gdb调试技巧,里面的技巧在开发过程中非常的实用,高清带书签版

    gdb调试方法与技巧

    gdb 调试文档,讲述GDB调试技巧,快速找到问题所在,内含实例精讲。

    用GDB调试程序

    用GDB调试程序,详尽的讲解让你快速掌握gdb调试技巧

    Linux gdb常用调试技巧

    资料中总结了gdb调试过程中应注意的一些细节,并根据经验给出了一些调试技巧,希望对您有帮助!

    gdb常用调试技巧收集

    gdb 使用的一些技巧整理,适合初学者。gdb是linux c 语言开发的必备调试工具,具有很强大的调试功能

    GDB使用和调试手册.pdf

    本文档为GDB使用和调试手册,可以根据本文档快速掌握GDB调试技巧,简单、易懂、全面!可以关注本人博客GDB调试篇快速掌握GDB技巧!

    Linux gdb 调试技术.pptx

    linux下使用gdb调试程序的教程。 详细讲解gdb工具的使用,以及调试技巧等。 linux上常用调试技术: 走读代码 打印日志 /proc/pid/... gdb、dbx strace、ltrace valgrind

    GDB调试精粹及使用实例

    GDB调试精粹及使用实例,描述实战中的gdb使用技巧,并配实例说明。

    100个gdb小技巧(v1.0).pdf

    非常好的gdb速查手册,适合gdb初学者,可以迅速了解到有哪些常用的gdb技巧。每个技巧都有相应的例子。

    100个gdb小技巧

    一个关于gdb使用小技巧的文档。100,在这里可能只是表明很多;具体的数目取决于您的参与和贡献。

    Linux实验七 GDB程序调试

    编写一个应用程序,使用gdb调试,并熟悉gdb中几个最常用的命令 2、实验器材: 软件: 安装了ubuntu的VMware虚拟机。 硬件: PC机一台。 3、背景知识: 细节详见官方网站相关内容:...

    linux-0.11源代码,修改后便于使用GDB调试

    在网络上下载到linux-0.11的源代码后,首先是不断地除错,最终使其能在ubuntu12.04上编译通过,并能用bochs仿真。后来发现bochs仿真bootsect.s不方便,就改用qemu仿真了。

    GDB的使用技巧培训

    本文详细介绍了在Linux环境下使用GDB如何调试应用程序的相关说明,大家通过阅读该文档,可以对GDB有一定的认识。

    GDB高级技巧:直接Debug修复BUG.pdf

    GDB 高级技巧:边Debug 边修复BUG,无需修改代码,无需重新编译

    gdb使用技巧

    gdb调试文档,看看不后悔。

    inux-gdb_详解

    linux GDB调试详细用法 以及调试技巧

Global site tag (gtag.js) - Google Analytics