首页 > 技术读物, 编程工具 > 高科技:GDB回溯调试

高科技:GDB回溯调试

2009年9月28日 发表评论 阅读评论 2,539 人阅读    

也许大家知道,GDB 版本7.0 (2009年9月release) 会是第一次开始支持Reversable Debugging (回溯调式技术),这是一种可以让在debug程序时当我们运行单步调试或是运行到断点时,可以以逆向执行程序的一种技术。(这是GNU的新闻链接

下面是GDB7.0版本所支持的回溯调试的命令,其中包括,continue,step,以及调试方向的设置。

  • reverse-continue (‘rc’) — 继续程序运行到断点,但是是逆向运行程序。
  • reverse-finish — 逆向运行程序直到跳出本层函数。
  • reverse-next (‘rn’) — 语句单步向后跟踪程序。
  • reverse-nexti (‘rni’) — 指令单步向后一条指令。
  • reverse-step (‘rs’) — 向后执行一条语句,单步进入。
  • reverse-stepi — 向后执行一条指令,单步进入。
  • set exec-direction (forward/reverse) — 设置程序执行方向,向前或向后。
  • 在网上查了一下,发现VS2010好像也准备要支持这个东西,微软叫这个东西为“Historical Debugging”。

    这个东西,对于我这个老家伙来说比较新鲜,而且还有点诡异。我有点没跟上这个技术,不知道这个技术主要是用来干什么?对于程序的运行的回滚?这样一来,如果,我某条语句创建了一个线程,或是一个文件,逆向执行回去,莫非它还能把这些程序创建出来的资源回收啦?就算是能回收,要是我的某个程序向网络发了些数据出去,莫非它还能给我再收回来?也许我想得太极端了,不过好像目前对这个技术的原始需求的说明不是很多,所以真不知道这个技术除了很酷,还有什么?也许是我理解错了,希望大家指点一下。





    好烂啊有点差凑合看看还不错很精彩 (7 人打了分,平均分: 5.00 )
    Loading ... Loading ...
    1. 2009年9月28日17:31 | #1

      真的啊?这个牛B了。。。打印出来的消息会给抹掉吗?

    2. 2009年9月28日21:59 | #2

      我估计就是调试过了后悔了这就一新的后悔药……
      调试的时候经常习惯性的下一步下一步……不小心就过头了,以前都要从头来,这下好了~

    3. 2009年9月29日00:14 | #3

      其实不是大家想的那样。逆向调试不是逆向执行,而是模拟逆向执行。在打开逆向调试开关后,程序的执行会记录下程序运行的详细状态轨迹(想象一下把图灵机运行时的每一步纸带的状态记录下来)。这些状态就构成了逆向调试的基础。

      逆向调试的预期用处是,因为程序bug的发生处和表现处一般会有距离,那么在程序bug表现处回溯执行,就可以确定地找到bug的真正原因。这可是很有用的哦,因为这可以避免多次运行程序,有时还徒劳武无功,尤其是在不确定bug (heisenbug)的情况下。

      偶然发现你的博客,很不错,我加到google reader里了。

    4. 2009年9月29日12:23 | #4

      这种技术貌似很强悍噢,很多时候我使用断点调试时不知道一个变量到底是在哪一行代码中赋值的,这时可以逆向回去一步一步地追查变量赋值的源头。不知道这种技术是不是干这个用的,呵呵

    5. flownight
      2009年9月29日22:35 | #5

      还是没搞清楚,直接break然后Jump不就可以跳回去而不用重复执行了吗?难道与jump的区别是将jump执行的side effects取消…这样的话,倒还是有用的

    6. larry
      2009年9月30日08:51 | #6

      VS2003里已经可以逆向调试了,可以把断点往后移动,不过没GDB这么强!

    7. ostric
      2009年9月30日12:55 | #7

      gnunu :其实不是大家想的那样。逆向调试不是逆向执行,而是模拟逆向执行。在打开逆向调试开关后,程序的执行会记录下程序运行的详细状态轨迹(想象一下把图灵机运行时的每一步纸带的状态记录下来)。这些状态就构成了逆向调试的基础。

      你的意思是说逆向调试的时候实际上已经正向执行过一次了?而且保存下来所有过程的状态?貌似是个很占内存的活啊。

    8. 2009年9月30日15:51 | #8

      @ostric
      ostric :

      你的意思是说逆向调试的时候实际上已经正向执行过一次了?而且保存下来所有过程的状态?貌似是个很占内存的活啊。

      还有楼上的 flownight :
      是的,是很占内存,还有硬盘,执行时生成的信息很多。没有免费午餐嘛。逆向执行本身毫无意义,也不可能,你不能取消已经造成的副作用,比如设备寄存器的读写(耗费的能量),否则不符合物理法则了。逆向调试的真正意义就在于能确定性地循迹回溯(拜于完整记录),知道程序执行过程中发生了什么事情,以便找到错误的发生地点。

    9. echotiro
      2009年10月3日14:15 | #9

      有一个中国的开发者参与了这个特性的开发噢,哈哈:

      # Hui Zhu contributed a process record port for amd64-linux
      # Hui Zhu contributed the process record framework, along with the original port for i386-linux

    10. Hui Zhu
      2009年11月26日11:19 | #10

      http://sourceware.org/gdb/wiki/ReverseDebug
      其实反向调试只是一个框架

      下面需要被调试目标来实现 本的的比如record http://sourceware.org/gdb/wiki/ProcessRecord
      或者靠REMOTE的 SIMICS VMWARE等等 http://www.gnu.org/software/gdb/news/reversible.html

    11. ggs334
      2010年6月3日10:43 | #11

      任何技术都是有一定的使用和适用范围的,个人感觉这个技术很不错

    12. walfud
      2010年10月13日11:49 | #12

      下载了,一个gdb7.1, 但是提示不支持命令rn,reverse-next好像也不行。好像没有领会高手们的意思。。。

    13. jogumsim
    1. 2010年10月11日10:20 | #1

    无觅相关文章插件,快速提升流量