我知道E&C是一个有争议的主题,有些人说它鼓励了错误的调试方法,但仍然 - 我认为我们可以同意,有很多情况下,它显然是有用的 - 尝试某些常数的不同值,重新设计GUI参数fly找到好看的外观...您可以命名。

我的问题是: 我们是否曾经在GDB上拥有E&C? 我了解这是一个特定于平台的功能,需要与编译器,调试器和操作系统的认真合作 (MSVC非常容易,因为编译器和调试器总是包含一个包), ,但是...仍然应该可行。我什至听说过有关Apple在其GCC版本中实现的一些信息 需要引用. 。我会说这确实是可行的。

了解有关MSVC E&C的所有炒作(我的经验说,这是MSVC用户提到的第一件事。 “为什么不切换到Eclipse和GCC/GDB”),令我感到惊讶的是,几年后,GCC/GDB仍然没有这种功能。有什么充分的理由吗?我们说的是有人在做它吗?

有帮助吗?

解决方案

这是一项令人惊讶的非平凡的工作,包括许多设计决策和特征权衡。考虑:您正在调试。 Debugee被暂停。其内存中的图像包含源的对象代码以及对象,堆,堆栈的二进制布局。调试器正在检查其内存图像。它已经加载了有关符号,类型,地址映射,PC(IP)的调试信息,以供源通信。它显示呼叫堆栈,数据值。

现在,您要允许对代码和/或数据进行特定的可能编辑,而无需停止调试和重新启动。最简单的可能是将一行代码更改为另一行。也许您会重新编译该文件或仅此功能或仅此行。现在,您必须修补Debuggee映像,以执行下次浏览或以其他方式运行的新代码行。在引擎盖下如何工作?如果代码大于其更换的代码行还会发生什么?它如何与编译器优化相互作用?也许您只能在专门编译的用于调试目标的专门编译中执行此操作。也许您会限制可能的网站,这是合法的。考虑:如果您在呼叫堆栈中悬挂的函数中编辑代码行,会发生什么。当代码返回时,它是否运行了更改函数的原始版本或使用行更改的版本?如果原始版本,该来源从何而来?

您可以添加或删除当地人吗?这对悬挂式框架的呼叫堆栈有什么影响?当前功能?

您可以更改功能签名吗?将字段添加到 /从对象中删除字段?现有实例呢?尚待驱动器或最终化器呢?等等。

有很多功能细节需要注意,以进行任何类型的用途。然后,需要许多跨工具集成问题,以便为电力提供基础架构。特别是,拥有某种调试信息的存储库,这些信息可以使调试器提供前和后编辑的调试信息和对象代码。对于C ++,PDBS中的可逐渐更新的调试信息有帮助。增量链接也可能有所帮助。

从MS生态系统到GCC生态系统,很容易想象GDB/GCC/Binutils之间的复杂性和集成问题,无数的目标,一些必需的特定ENC特定目标抽象以及“不错的东西,但具有“不必要的”性质“自然” ENC是为什么它尚未出现在GDB/GCC中的原因。

快乐黑客!

(PS查看SmallTalk-80交互式编程环境的启发性和鼓舞人心。您仍然必须继续运行的课程。在这样的环境中,对象版本不是假设的。)

其他提示

我不熟悉MSVC的E&C,但是GDB有一些您提到的事情:

http://sourceware.org/gdb/current/onlinedocs/gdb/altering.html#altering

17.更改执行

一旦您认为程序中发现了错误,您可能需要确定是否纠正明显的错误是否会导致在其余运行中纠正结果。您可以通过实验找到答案,使用GDB功能来更改程序的执行。

例如,您可以将新值存储到变量或内存位置中,向您的程序发出信号,在不同的地址重新启动,甚至从函数过早返回。

任务: :分配变量
跳跃: :继续在不同的地址
信号: :向您的程序发出信号
返回: :从功能返回
打电话: :调用程序的功能
补丁: :修补程序
编译和注入代码: :在GDB中编译和注入代码

这是一个很好的引用,即“修复和继续”的旧苹果实现。它还引用了其他工作实现。

http://sources.redhat.com/ml/gdb/2003-06/msg00500.html

这是一个片段:

Fix and Clough是许多其他调试者实施的功能,我们将其添加到GDB中以供此版本。 Sun Workshop,SGI Prodev研讨会,微软的Visual Studio,HP的WDB和Sun的Hotspot Java VM都以一种或另一种方式提供此功能。我将我们的实施基于HP WDB修复和继续功能,几年前它们增加了。尽管我的最终实现遵循了他们采取的方法的一般概述,但它们之间几乎没有共享代码。其中一些是因为建筑差异(处理器和ABI),但更多是由于实施设计差异所致。

请注意,此功能可能已在其工具链的后期版本中删除。

更新:2012年12月21日有一个 GDB路线图 PDF演示文稿包括幻灯片描述“修复和继续”等其他要点。演讲的日期为2012年7月9日,因此也许希望在某个时候添加它。演讲是 GNU工具Cauldron 2012.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top