https://blog.csdn.net/thz2011/article/details/53977476
gdb回退调试
https://blog.csdn.net/xungjhj/article/details/73727477
https://blog.csdn.net/LBO4031/article/details/8949748
GDB高级调试命令总结
https://blog.csdn.net/softgmx/article/details/79406131
普通的调试过程都是只能让程序按正向的顺序执行,直到程序运行结束,单步调试也是只能下一步下一步。而反向调试可以实现的是,让程序实现上一步上一步的操作,也就是说让程序反向运行。
首先要强调的一点是反向调试不适用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
- 1
- 2
- 3
备注:注意record 这个指令就是让程序开始记录反向调试所必要的信息,其中包括保存程序每一步运行的结果等等信息,所以如果没有运行此指令,是没有办法进行反向调试的,
停止反向调试使用的是record stop ,这样反向调试的记录停止,可以正常运行程序了。
然后我们就可以输入
rs
rn
这类指令了
不想进行反向调试的时候,输入record stop 指令就可以终止。
方向调试的功能确实很奇特,但是一直饱受质疑的就是它有什么作用呢?