gdb高级调试——反向调试

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/thz2011/article/details/53977476

普通的调试过程都是只能让程序按正向的顺序执行,直到程序运行结束,单步调试也是只能下一步下一步。而反向调试可以实现的是,让程序实现上一步上一步的操作,也就是说让程序反向运行。
首先要强调的一点是反向调试不适用io操作,碰到io操作是无法运行下去的。所以反向测试的时候,需要保证要调试的那部分代码没有输入输出操作。还有就是GDB7.0以上的版本的调试器才支持反向调试,这个功能目前不是很完美,不过正常的使用是没有问题的。

相关指令:
rc 或 reverse-continue
反向运行程序,直到碰到一个能使程序中断的事件,比如断点,观察点,异常,还有就是反向调试的起点。

rs 或reverse-step
反向运行程序到上一次被执行的源代码行。rs是可以进入函数的

rsi 或reverse-stepi
反向运行程序到上一条机器指令,这条指令提供更细致的反向运行

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

rni 或reverse-nexti
反向运行到上一条机器指令,除非这条指令用来返回一个函数调用,否则整个函数将会被反向执行。

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

set exec-direction [forward | reverse]
设置程序运行方向,可以用平常的命令step和continue等来执行反向的调试命令。

编写测试程序:

//程序名:reverse.cpp
 #include <iostream>
  intselfAve(int num[],int len)
  {
   int ave = 0;
int numSum = 0;
   for(int i = 0;i < len;i++)
     numSum = numSum + num[i];
   ave = numSum/len;
   return ave;
  }

  intmain()
  {
   int num[10] = {1,2,3,4,5,6,7,8,9,10};
   int len = 10;
   int ave = 0;
   ave = selfAve(num,len);
   std::cout << " the average of nums is " << ave<<std::endl;
   return 0;
  }

可以看出此程序本来是相求一个数组的平均值。
你使用:g++ -greverse.cpp -o out
编译后,运行./out

来调试一下
运行下面的指令:

gdb out
start
record    

备注:注意record 这个指令就是让程序开始记录反向调试所必要的信息,其中包括保存程序每一步运行的结果等等信息,所以如果没有运行此指令,是没有办法进行反向调试的,
停止反向调试使用的是record stop ,这样反向调试的记录停止,可以正常运行程序了。

然后我们就可以输入
rs
rn
这类指令了

不想进行反向调试的时候,输入record stop 指令就可以终止。

方向调试的功能确实很奇特,但是一直饱受质疑的就是它有什么作用呢?

展开阅读全文

没有更多推荐了,返回首页