gdb高级调试——反向调试
来源:互联网 发布:java程序员用什么系统 编辑:程序博客网 时间:2024/06/16 02:50
普通的调试过程都是只能让程序按正向的顺序执行,直到程序运行结束,单步调试也是只能下一步下一步。而反向调试可以实现的是,让程序实现上一步上一步的操作,也就是说让程序反向运行。
首先要强调的一点是反向调试不适用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 outstartrecord
备注:注意record 这个指令就是让程序开始记录反向调试所必要的信息,其中包括保存程序每一步运行的结果等等信息,所以如果没有运行此指令,是没有办法进行反向调试的,
停止反向调试使用的是record stop ,这样反向调试的记录停止,可以正常运行程序了。
然后我们就可以输入
rs
rn
这类指令了
不想进行反向调试的时候,输入record stop 指令就可以终止。
方向调试的功能确实很奇特,但是一直饱受质疑的就是它有什么作用呢?
- gdb高级调试——反向调试
- gdb反向调试命令
- GDB 反向调试
- gdb 调试高级命令
- gdb高级调试方法
- GDB高级调试
- gdb 调试高级命令
- gdb 调试高级命令
- [C++] gdb高级调试方法
- Linux GDB core高级调试
- GDB 反向调试(Reverse Debugging)
- GDB 反向调试(Reverse Debugging)
- GDB 反向调试(Reverse Debugging)
- GDB 反向调试(Reverse Debugging)
- GDB 反向调试(Reverse Debugging)
- GDB 反向调试(Reverse Debugging)
- 调试工具——gdb
- gdb调试——堆栈
- 大牛请进,Android音视频聊天各种实现方式问题
- VMware安装mac问题
- Matlab 3.接上回 reshape 函数,矩阵的变维,实现矩阵的再分割和再拼接,多维转化。
- Araxis Merge对比软件工具
- 年初小记-总规划
- gdb高级调试——反向调试
- 关于学习安卓系统
- angularJS directive详解
- sourcetree使用遇到的问题
- 为什么Android SDK manager的API有的总是下载失败
- 在程序启动后想让按钮处于被选中状态?!
- mssql数据库replace函数的用法请教
- Android开发,输入框不被输入法顶上去
- classLoader深度剖析