checkpoint是程序在那一刻的快照,当我们发现错过了某个调试机会时,可以再次回到checkpoint保存的那个程序状态。
举例说明一下:
- #include <stdlib.h>
- #include <stdio.h>
- static int func()
- {
- static int i = 0;
- ++i;
- if (i == 2) {
- return 1;
- }
- return 0;
- }
- static int func3()
- {
- return func();
- }
- static int func2()
- {
- return func();
- }
- static int func1()
- {
- return func();
- }
- int main()
- {
- int ret = 0;
- ret += func1();
- ret += func2();
- ret += func3();
- return ret;
- }
当我们执行这个程序时,发现程序返回1,不是期望的成功0。于是开始调试程序,由于函数调用的嵌套过多,我们没法一眼看出是main中的哪个函数调用出错了。于是在ret += func1()前,我们保存一个checkpoint。
- (gdb) b main
- Breakpoint 1 at 0x80483e0: file test.c, line 31.
- (gdb) r
- Starting program: /home/fgao/works/test/a.out
- Breakpoint 1, main () at test.c:31
- 31 int ret = 0;
- Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.i686
- (gdb) n
- 33 ret += func1();
- (gdb) checkpoint
- checkpoint: fork returned pid 2060.
- (gdb)
然后使用next步进,并每次调用完毕,打印ret的值
- Breakpoint 1, main () at test.c:31
- 31 int ret = 0;
- (gdb) n
- 33 ret += func1();
- (gdb) checkpoint
- checkpoint: fork returned pid 2060.
- (gdb) n
- 34 ret += func2();
- (gdb) p ret
- $4 = 0
- (gdb) n
- 35 ret += func3();
- (gdb) p ret
- $5 = 1
结果发现,在调用func2()调用后,ret的值变为了1。可是此时,我们已经错过了调试func2的机会。如果没有checkpoint,就需要再次从头调试了——对于这个问题从头调试很容易,但是对于很难复现的bug可就不说那么容易的事情了。
ok,使用checkpoint恢复
- (gdb) restart 1
- Switching to process 2060
- #0 main () at test.c:33
- 33 ret += func1();
- (gdb)
很简单,现在GDB恢复到了保存checkpoint时的状态了。上面“restart 1“中的1为checkpoint的id号,可以使用info查看。
- (gdb) info checkpoints
- * 1 process 2060 at 0x80483e7, file test.c, line 33
- 0 process 2059 (main process) at 0x80483f7, file test.c, line 35
从上面可以看出checkpoint的用法很简单,但是很有用。就是在平时的简单的bug修正中,也可以加快我们的调试速度——毕竟减少了不必要的重现bug的时间。
相关推荐
本书介绍了大量的gdb调试技巧,里面的技巧在开发过程中非常的实用,高清带书签版
gdb调试.pdf,快速GDB调试入门..........
Linux gdb 调试技巧 在本文中,我们将总结 GDB 调试过程中的一些重要细节,并提供了一些有用的调试技巧。 启动 GDB GDB 提供了两种方式来启动调试: 1. 启动 Core 文件:`gdb <program> core` 2. 附加到已运行的...
该手册涵盖了 GDB 的基本概念、使用方法、调试技巧等内容,是 STM32 开发者的必备指南。 描述解释 本手册是 STM 官方提供的 STM32 调试指南,旨在指导开发者使用 GDB 调试 STM32 微控制器。该手册详细介绍了 GDB 的...
在IT行业中,调试是开发过程中的重要环节,用于找出并修复...总之,熟练掌握GDB调试技巧,能极大地提高程序员的效率,减少bug的生命周期,确保软件质量。通过实践和学习,你将能够运用这些命令解决各种复杂的调试问题。
总之,Linux下的GDB调试技巧对于任何开发者来说都是必备技能,无论是在排查复杂问题还是优化代码性能方面,都能发挥巨大作用。通过深入学习和实践,你将能够熟练运用GDB解决各类编程挑战。这份"Debug with GDB"的...
《GDB调试程序[陈皓]》与《GDB调试工具指南》这两份PDF文档,是深入了解和精通GDB(GNU Debugger)这一强大调试工具的重要参考资料。GDB是开源世界中广泛使用的C、C++以及其他多种语言的调试器,它允许开发者在运行...
gdb 调试文档,讲述GDB调试技巧,快速找到问题所在,内含实例精讲。
陈浩的《用GDB调试程序》和守望的个人博客的《GDB调试指南》这两份资料,提供了丰富的实践案例和详细的操作步骤,帮助读者从基础到进阶掌握GDB的使用技巧。通过阅读这些教程,你可以了解如何有效地使用GDB解决实际...
通过深入学习和实践这些GDB调试技巧,开发者可以更加高效地定位和修复程序中的问题,提高代码质量和软件可靠性。记得结合“gdb调试方法.txt”文件中的具体示例和实践操作,以便更好地理解和掌握GDB的使用。
用GDB调试程序,详尽的讲解让你快速掌握gdb调试技巧
以下是一些`gdb`常用的调试技巧: 1. **启用gdb调试** - **启动core**:当你有一个程序崩溃并产生了核心转储文件(core dump),你可以用`gdb <program> core`命令来调试,其中`<program>`是导致core dump的程序,...
调试技巧 1. 使用.gdbinit文件:可以在调试目录下建立名为.gdbinit的文件,以便减少每次启动设置连接参数。 2. 使用网络调试:网络调试可以提供更高的调试效率和稳定性。 3. 使用可视化图形前端:ddd和insight等...
《gdb调试工具使用手册》 GDB,全称GNU Debugger,是Unix及类Unix操作系统上广泛使用的C和C++程序的调试工具。它为开发者提供了丰富的功能,帮助他们跟踪和理解程序的运行过程,定位并修复代码中的错误。本文将深入...
四、高级调试技巧 1. **条件断点**:`break line_number if condition`可以在满足特定条件时触发断点。 2. **监视变量**:`watch variable_name`在变量值改变时触发断点。 3. **数据观察点**:`rwatch variable_name...
**gdb调试指南** 在软件开发过程中,遇到程序运行异常或错误是常见的事情。这时,开发者需要一种工具来帮助理解程序的行为,定位问题所在。`gdb`(GNU调试器)就是这样一款强大的命令行工具,它能让我们在程序运行...
总的来说,这些资料全面覆盖了GDB调试的基本操作和高级技巧,是学习和提升GDB调试能力的理想资源。通过深入学习,开发者可以更好地理解程序运行状态,有效地定位和解决问题,提高软件开发效率和质量。