加入你正在使用GDB7.0以上版本的调试器并且运行在支持反向调试的平台,你就可以用以下几条命令来调试程序:

reverse-continue

反向运行程序知道遇到一个能使程序中断的事件(比如断点,观察点,异常)。

reverse-step

反向运行程序到上一次被执行的源代码行。

reverse-stepi

反向运行程序到上一条机器指令

reverse-next

反向运行到上一次被执行的源代码行,但是不进入函数。

reverse-nexti

反向运行到上一条机器指令,除非这条指令用来返回一个函数调用、整个函数将会被反向执行。

reverse-finish

反向运行程序回到调用当前函数的地方。

set exec-direction [forward | reverse]

设置程序运行方向,可以用平常的命令step和continue等来执行反向的调试命令。

上面的反向运行也可以理解为撤销后面运行的语句所产生的效果,回到以前的状态。

好的,接下来我们来试试看如何反向调试。

首先确认自己的平台支持进程记录回放(Process Record and Replay),当在调试器启用进程记录回放功能时,调试器会记录下子进程,也就是被调试进程的每一步的运行状态与上一步运行状态的差异,需要撤销的时候就可以很方便回到上一步。

假设我们有以下C程序:

  1. int main(int argc, const char *argv[])
  2. {
  3. int a = 0;
  4. a = 1;
  5. a = 2;
  6. return 0;
  7. }

将它编译并加上调试符号:

  1. $ gcc -Wall -g a.c

开始调试:

  1. $ gdb a.out

查看一下源代码:

  1. (gdb) l
  2. 1   int main(int argc, const char *argv[])
  3. 2   {
  4. 3     int a = 0;
  5. 4     a = 1;
  6. 5     a = 2;
  7. 6     return 0;
  8. 7   }

接下来设置一个断点在第三行:

  1. (gdb) b 3
  2. Breakpoint 1 at 0x804839a: file a.c, line 3.

运行,程序会在第三行的地方停下来:

  1. (gdb) r
  2. Starting program: /home/cheryl/a.out
  3. Breakpoint 1, main (argc=1, argv=0xbffff3e4) at a.c:3
  4. 3     int a = 0;

给变量a设置监视点方便我们观察:

  1. (gdb) watch a
  2. Hardware watchpoint 2: a

启动进程记录回放:

  1. (gdb) record

现在每运行一步调试器都会记录下变化,以便回溯。我们连续执行3条语句。

  1. (gdb) n
  2. 4     a = 1;
  3. (gdb)
  4. Hardware watchpoint 2: a
  5. Old value = 0
  6. New value = 1
  7. main (argc=1, argv=0xbffff3e4) at a.c:5
  8. 5     a = 2;
  9. (gdb)
  10. Hardware watchpoint 2: a
  11. Old value = 1
  12. New value = 2
  13. main (argc=1, argv=0xbffff3e4) at a.c:6
  14. 6     return 0;

可以看到,a的值先是从0变为了1,然后变为2,如果想让程序倒退回到以前的状态怎么办?可以用reverse-next命令:

  1. (gdb) reverse-next
  2. Hardware watchpoint 2: a
  3. Old value = 2
  4. New value = 1
  5. main (argc=1, argv=0xbffff3e4) at a.c:5
  6. 5     a = 2;
  7. (gdb)
  8. Hardware watchpoint 2: a
  9. Old value = 1
  10. New value = 0
  11. main (argc=1, argv=0xbffff3e4) at a.c:4
  12. 4     a = 1;
  13. (gdb)
  14. No more reverse-execution history.
  15. main (argc=1, argv=0xbffff3e4) at a.c:3
  16. 3     int a = 0;
  17. (gdb)

这样程序就倒退到了我们启动进程记录回放的地方,a的值经过两步回到了最初的状态。

若需要关闭进程记录回放,可以使用record stop:

  1. (gdb) record stop
  2. Process record is stoped and all execution log is deleted.

参考:《Reverse Debugging with GDB》 --- http://sourceware.org/gdb/wiki/ReverseDebug

gdb调试4--回退的更多相关文章

  1. gdb 调试入门,大牛写的高质量指南

    引用自:http://blog.jobbole.com/107759/ gdb 调试 ncurses 全过程: 发现网上的“gdb 示例”只有命令而没有对应的输出,我有点不满意.gdb 是 GNU 调 ...

  2. gdb 调试 ncurses 全过程:

    转载地址: http://blog.jobbole.com/107759/ gdb 调试 ncurses 全过程: 发现网上的“gdb 示例”只有命令而没有对应的输出,我有点不满意.gdb 是 GNU ...

  3. GDB调试命令小结

    1.启动调试 前置条件:编译生成执行码时带上 -g,如果使用Makefile,通过给CFLAGS指定-g选项,否则调试时没有符号信息.gdb program //最常用的用gdb启动程序,开始调试的方 ...

  4. GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析 分析过程 这是我的C源文件:click here 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb ...

  5. gdb调试器的使用

    想要使用gdb调试程序的话,首先需要gcc -g main.c -o test 然后运行gdb test对程序进行调试 l (小写的l,是list的首字母),用以列出程序 回车    是运行上一个命令 ...

  6. 20145212——GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析 测试代码 #include <stdio.h> short val = 1; int vv = 2; int g(int xxx) { return xxx + ...

  7. gdb调试PHP扩展错误

    有时候,使用PHP的第三方扩展之后,可能会发生一些错误,这个时候,可能就需要更底层的方式追踪调试程序发生错误的地方和原因,熟悉linux下C编程的肯定不陌生gdb 首先,使用ulimit -c命令,查 ...

  8. gdb调试汇编堆栈过程的学习

    gdb调试汇编堆栈过程的学习 以下为C源文件 使用gcc - g code.c -o code -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 进入之 ...

  9. gdb调试

    ·代码(实验楼中的代码,改了部分数值)命名为test.c int g(int x) { return x + 7; } int f(int x) { return g(x); } int main(v ...

  10. 20145223《信息安全系统设计基础》 GDB调试汇编堆栈过程分析

    20145223<信息安全系统设计基础> GDB调试汇编堆栈过程分析 分析的c语言源码 生成汇编代码--命令:gcc -g example.c -o example -m32 进入gdb调 ...

随机推荐

  1. nginx keepalived 高可用方案(转)

    转自: https://www.cnblogs.com/leeSmall/p/9356535.html 一.Nginx Rewrite 规则 1. Nginx rewrite规则 Rewrite规则含 ...

  2. No.11_功能规格说明书

    功能规格说明书 • 基本目标 为用户提供更加便捷和人性化的闹钟提醒服务,以群组为单位规划时间安排与分配,对于个人用户,实现个人的设置闹钟,取消闹钟的操作,这些操作将会上传至数据库,并被同步到所有的客户 ...

  3. Code128

    条形码 条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符.常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案.条形 ...

  4. 【CS231N】1、图像分类

    一.知识点 1. 计算机识别物体面临的困难 视角变化(Viewpoint variation):同一个物体,摄像机可以从多个角度来展现. 大小变化(Scale variation):物体可视的大小通常 ...

  5. 推荐一个Markdown数学公式编辑器——Haroopad & Mathjax

    要在Markdown里插入数学公式,如果没有好用的的引擎or编辑器,那么只能插入图片了,十分麻烦.这里推荐一个十分强大的数学公式引擎--Mathjax. 配置 有道云笔记目前不支持浏览MathJax公 ...

  6. AG-Admin微服务框架入门

    AG-Admin微服务框架入门  @qq群:一群: 837736451  二群 169824183 一 概要介绍 AG-Admin后台地址:https://gitee.com/minull/ace-s ...

  7. 360Vedio To NFOV Vedio

    Deep 360 Pilot Learning a Deep Agent for Piloting through 360° Sports Videos 源码.数据集和视频演示 ego-centric ...

  8. Sql Server中判断表、列不存在则创建的方法[转]

    一.Sql Server中如何判断表中某列是否存在 首先跟大家分享Sql Server中判断表中某列是否存在的两个方法,方法示例如下: 比如说要判断表A中的字段C是否存在两个方法: 第一种方法  ? ...

  9. 在linux中安装jdk以及tomcat并shell脚本关闭启动的进程

    在命令行模式中输入uname -a ,如下图,当界面展示i386就说明本linux系统为32版本,就在官网下载对应jdk版本,或者直接到我的网盘上下载http://pan.baidu.com/s/1c ...

  10. vSphere下安装Hyper-V

    在vSphere 5.5中默认是无法嵌套安装Hyper-V的,必须在vSphere中稍作修改. 1. 勾选这两个选项,如果是灰色,请升级虚拟机版本至最新: 2. 在配置文件中手动加入这一行参数: 3. ...