为什么很少使用反向调试?[关闭]


56

gdb 在2009年(使用gdb 7.0)中实现了对反向调试的支持。直到2012年我才听说过它。现在,我发现它对于某些类型的调试问题非常有用。我希望我以前听说过。

如果我错了,请纠正我,但我的印象是该技术仍然很少使用,并且大多数人都不知道它存在。为什么?

您是否知道在任何编程社区中普遍使用反向调试?

背景资料:


47
为了使那些不知道它存在的人受益,什么反向调试?
梅森惠勒2013年

5
MS称他们的系统为intellitrace,它看起来与您所说的revese调试类似,这可能是多个名称的问题,具体取决于环境,从而使它看起来较少使用。
Ryathal 2013年

1
物有所值:它确实比您想像的要老得多-Microsoft在QuickC中支持它(如果有内存,大约在1989或90年代)。
杰里·科芬

41
@MasonWheeler,显然,反向调试是向代码中添加错误的行为。我不同意OP的前提,即这是不常见的做法。
本李

3
@BenLee,我们称其为调试。
OldFart

Answers:


26

第一个原因是,在调试模式下运行并记录下来比在常规调试模式下运行非常昂贵。它也会消耗更多的内存。

从行级别到函数调用级别减小粒度更容易。例如,eclipse中的标准调试器允许您“拖放到框架”,本质上是通过重置所有参数来跳回到函数的开头(不还原堆上的任何内容,并且finally不执行块,因此它不是真正的反向调试器;请注意这一点。

请注意,此功能已经使用了几年,并且可以与热代码替换配合使用。


1
很好的答案。我可以确认录制非常昂贵。您必须在进入应用程序的关键部分之前启用它,这并不总是很简单的。我也同意,“框框式”通常就足够了。但是,它不适用于循环或递归算法。
PhilippClaßen2013年

2
直到rr(rr-project.org)。使用rr记录执行时的速度几乎不慢。然后,您可以在自己喜欢的IDE(github.com/mozilla/rr/wiki/Using-rr-in-an-IDE)中重放,加入,倒带,设置观察者...调试代码的方式永远不会相同。
jyavenard

11

如前所述,性能是关键,例如,使用gdb的可逆调试,运行gzip之类的文件与本地运行相比,速度降低了50,000倍。但是,还有其他商业选择:我为Undo undo.io工作,我们的UndoDB产品也可以这样做,但速度却不到2倍。也有其他商业可逆调试器可用。


1
有趣的是,我一定会尝试的。在几篇文章中都说过,它可免费用于非商业用途,但我在您的主页上找不到可证实这一点的信息。还是这样吗?感谢您披露您的从属关系。
PhilippClaßen2013年

2
UndoDB的入门版和专业版的价格是多少?我在UndoDB版本页面上看不到它们。
tcrosley13年

3
你们与Mozilla的相比如何rr
Ciro Santilli新疆改造中心法轮功六四事件

10

有关技术选择和产品的概述,请参阅我一年前写的一系列博客文章(以及此后的一些后续报道):

我之所以很少使用它,是因为它需要特殊的硬件,或者使用特殊的调试器,或者正确设置系统。不幸的是,大多数人没有花时间从他们的调试工具中获得最大价值。

而且,gdb的“廉价默认值”几乎是非常缓慢的,并且除了最常见的目标系统之外,所有其他东西都存在很多稳定性问题。


4

从我作为TotalView调试器的销售工程师的经验来看,人们确实知道它存在,但是无论速度(是否可以接受),他们都认为它不起作用。

剑桥大学最近进行了一项题为“未能通过反向调试使全球经济每年损失410亿美元”的调查

回到GDB,我已经(很多)听到,减速使它在“现实生活”的应用程序中变得非常不可用。

我个人很想听到更多人对“ Hello world!”以外的应用程序进行反向调试的反馈。


4
我认为最好将这项研究链接起来,而不要假装与研究有关的“撤消软件”垃圾邮件。
Bulwersator 2014年

1
在我以前的工作中,我致力于构建反向调试器(ghs.com/products/timemachine.html)。我们在内部大量使用了调试器,我可以告诉您,这太不可思议了。当然,在真正毛茸茸的比赛条件下,这很棒,但不仅如此。始终进行反向调试时,您对调试的想法就会改变。您可以减少迭代,并且可以减少测试代码时的注意。您还可以保存执行运行并将其发送给某人,因此非常适合查找其他人代码中的错误。
Speedplane

2

我认为对这种“反向”或“历史性”调试进行进一步扩展很重要。我认为,了解其中的复杂系统和行为,重播使状态明确的“事件”绝对至关重要。

我想表达的是,您并不孤单地想知道为什么这种技术在今天没有得到广泛应用,或者为什么很少清楚地讨论相关问题。

因此,让我们在这里强调两个非常重要的概念:

1.要了解编程系统,使状态明确是有帮助的

2.为了进一步了解编程系统,重播状态(事件)序列会很有帮助。

以下是解决该问题并提出或设计该问题的解决方案的一些资料(处理复杂系统中的状态):

-在焦油钻头外面,论文:http ://shaffner.us/cs/papers/tarpit.pdf 主要思想:避免,孤立或使状态明确

-CQRS http://www.cqrs.nu/ 这是两个概念的组合:命令查询隔离和事件源。存在不同的实现(Java,C#和Scala)。塔特序列的重播和域模型的演变是这里的关键部分。

如果您真的放大并看到了广阔的画面,您已经可以看到,随着函数式编程的“兴起”,人们已经(不自觉地)被fp吸引了,因为它使状态变得明确!但这仅涉及第一个问题,要解决第二个问题,您需要另一个概念,该概念可以“轻松地”描述为函数式反应式编程。

所以您可能说的很好,但是谁真正使用了CQRS和FRP?我会说(IMO,因为我没有具体数字)实际上很多公司只是因为他们不知道他们所从事的工作具有这种术语。也许您在Google周围徘徊,并且听到使用CQRS的企业的消息,已经有一些成功的故事。FRP也在缓慢上升,例如,我可以给Netflix:http : //techblog.netflix.com/2013/02/rxjava-netflix-api.html 刚刚发布了RX的实现,它实际上是基于.NET的(但具有JavaScript实现)。因此,人们今天已经在使用这些技术,以了解复杂的系统并使它们变得更好。这就是为什么他们使用反向调试技术。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.