如何对程序进行双向或反向调试?

时间:2009-02-06 23:11:41

标签: gdb debugging reverse-debugging

有没有人真正使用过可逆调试器? Google出现的唯一产品是UndoDB。它显然仅适用于Linux。

11 个答案:

答案 0 :(得分:8)

最新的gdb 7.0版(本周发布)支持在许多平台上进行反向调试(例如,本机i386和x86_64 linux,VMware工作站,UndoDB和Virtutech的Simics模拟器)。 ftp://ftp.gnu.org/pub/gdb

它适用于VMware工作站7.0的最新预览/预发布,它还支持使用Visual Studio调试器对MSWindows客户端进行反向调试。在http://communities.vmware.com/community/beta/workstation获取工作站7.0的免费试用版下载,并在http://communities.vmware.com/docs/DOC-10714

上找到一些有用的使用技巧

答案 1 :(得分:5)

新发布的gdb-7.0包括本机linux x86和x86_64的反向调试功能。您可以像往常一样调试任何Linux程序,打开“录制”功能,从那时起,如果向前走太远,您可以退步或反向继续到断点。

答案 2 :(得分:5)

作为一个有趣的历史记录,EXDAMS在60年代后期为MULTICS实施了事后反向调试。

答案 3 :(得分:4)

你要找的词可能是“无所不知的调试”。

这是一个:http://www.lambdacs.com/debugger/

UndoDB页面有一些指向(昂贵的)商业调试器的链接。

答案 4 :(得分:3)

VS 2010应该有这样的东西,我想。

答案 5 :(得分:3)

是的,自2005年以来我一直使用Virtutech Simics反向。它非常有用,并且确实可以使大多数错误修复非常简单。特别是与时间和竞争条件有关的那些,以及多核/线程“heisenbugs”。

请参阅http://jakob.engbloms.se/archives/1547http://jakob.engbloms.se/archives/1554http://jakob.engbloms.se/archives/1564,了解迄今为止最常见的反向调试器尝试。

答案 6 :(得分:3)

虽然这个问题很老,但仍然是一个有趣的话题,所以我想我会发布一个更新的答案。我的论文Combining reverse debugging and live programming towards visual thinking in computer programming涵盖了一些历史方法,并解释了无所不知的调试和真正的反向调试之间的区别:

  

计算机在某些方面已向前执行该程序,应该能够真正向我们提供有关它的信息。这种改进是可能的,并且可以在所谓的无所不知的调试器中找到。它们通常被归类为反向调试器,尽管它们可能更准确地被描述为"历史记录"调试器,因为它们仅在执行期间记录信息以便稍后查看或查询,而不是允许程序员在执行程序中实际倒退。 "全知"来自这样一个事实,即已经记录的程序的整个状态历史记录在执行后可供调试器使用。因此无需重新运行程序,也无需手动编写代码。

     

基于软件的无所不知的调试始于1969年的EXDAMS系统,在那里被称为“调试时间历史 - 回放”#34;自2009年以来,GNU调试器GDB一直支持无所不知的调试,其过程记录和重放'特征。 TotalView,UndoDB和Chronon似乎是目前可用的最好的全知调试器,但它们是商业系统。对于Java来说,TOD似乎是最好的开源替代方案,它利用部分确定性重放,以及部分跟踪捕获和分布式数据库来记录所涉及的大量信息。

     

不仅允许导航记录,而且实际上能够在执行时间内倒退的调试器也存在。它们可以更准确地描述为回溯时间,时间旅行,双向或反向调试器。

     

第一个这样的系统是1981年的COPE原型......

答案 7 :(得分:2)

您可以考虑使用最新版本的VMware Workstation中提供的VMware重播调试,例如:见http://www.replaydebugging.com/2008/08/vmware-workstation-65-reverse-and.html。您可以在http://www.vmware.com/products/ws/下载试用版,它适用于Visual Studio。

(免责声明:我为VMware工作,但不在此产品上。)

答案 8 :(得分:2)

是的,我已经在90年代使用了它.Watcom C调试器(理解为FORTRAN和大多数其他语言)可以选择让你及时前进。

这很棒,但不是一件大事......

答案 9 :(得分:1)

我在Linux上使用UndoDB而不是每个调试会话的普通gdb。反向调试非常有用,可以显着加快调试速度。您可以从问题的症状开始调试(例如断言失败或打印一些错误的消息)并及时调试,查找问题的根本原因。

答案 10 :(得分:1)

Mozilla rr基于开源跟踪的反向调试

https://github.com/mozilla/rr

它类似于UndoDB,但是免费和开源。

不幸的是,仅适用于Linux x86,因为此类工具需要高级操作系统功能才能有效工作。

以下是rr的最小示例:How to go to the previous line in GDB?