4

最近,我开始在 C++ 中使用 gdb 进行反向调试,它对于某些类型的问题(例如,循环和递归算法)非常有效。除了 gdb,还有其他用于 C/C++ 的商业调试器(例如UndoDB)。

我想知道其他语言是否有好的可逆调试器?我对 Java 和 Ruby 特别感兴趣,但这个问题对任何语言都是开放的。

我发现的另一种方法是在虚拟机上运行您的应用程序并连接到它。我知道(但从未测试过)的唯一实现是VMware 的 Replay Debugging。我想知道它适合哪些类型的调试任务。对于最常见的问题似乎有点过头了,但它可能对调试通信或同步问题很有用,这些问题通常很难重现。

背景资料:

  • gdb 使用术语“反向调试”。但是,有很多同义词:
    • “可逆调试”
    • 微软称其为 IntelliTrace 或“历史调试”
    • 在 Java 中,此类调试器有时被称为“Ominiscient Debugger”
  • (关于programmers.stackexchange)为什么很少使用反向调试?
4

4 回答 4

2

为什么很少使用反向调试?(在programmers.stackexchange 上),Jakob Engblom 就逆向调试的当前状态发表了一篇精彩的总结:

于 2013-01-07T04:42:56.800 回答
2

Jiva声称它可以:

JIVE 支持 Java 程序的正向和反向步进。...提供后退的能力可以节省程序员重新执行程序直到出错点的时间和精力。JIVE 还提供了直接跳回执行历史中任何先前点的能力,以便观察该点的对象图。

于 2013-01-04T21:55:16.180 回答
1

很抱歉这个相当迟的回复。是的,JIVE 的反向步进对于调试非常有效。您可以单步执行或跳回执行历史记录中的任何点。

您还可以对执行历史提出查询,例如,“显示对 x 的所有更改”、“x 什么时候第一次变为负数”、“这行代码是否曾经执行过;如果有,在哪里执行?”等等。所有这些都可以通过一个简单的基于表单的查询来完成。

http://www.cse.buffalo.edu/jive

于 2014-07-29T04:46:36.730 回答
1

您可以查看Omniscient Debugging作者 Bil​​ Lewis论文将其称为 ODB 的内容。ODB 是一种离线日志回放方式的实现,使Java中的逆向调试成为现实。

于 2017-10-11T06:47:25.443 回答