1
16
这是一个惊人的非平凡的工作量,包括许多设计决策和特性权衡。考虑:您正在调试。德彪基被停职了。它在内存中的图像包含源的对象代码,以及对象、堆和堆栈的二进制布局。调试器正在检查其内存映像。它已经加载了有关符号、类型、地址映射、PC(IP)到源通信的调试信息。它显示调用堆栈、数据值。 现在,您希望允许对代码和/或数据进行特定的可能编辑,而不必停止调试对象并重新启动。最简单的可能是将一行代码更改为另一行代码。也许您重新编译那个文件,或者只是那个函数,或者只是那个行。现在,您必须修补调试对象映像,以便在下一次跨过它或运行它时执行新的代码行。在引擎盖下如何工作?如果代码大于它所替换的代码行,会发生什么?它如何与编译器优化交互?也许您只能在专门为ENC调试目标编译的环境中执行此操作。也许您会限制可能的站点,这是合法的。考虑一下:如果您在调用堆栈中挂起的函数中编辑一行代码,会发生什么情况。当代码返回时,它运行的是函数的原始版本还是行更改后的版本?如果是原始版本,那么该源代码来自哪里? 可以添加或删除本地变量吗?这对挂起的帧的调用堆栈有什么影响?当前函数的? 你能更改函数签名吗?向对象添加字段/从对象中删除字段?现有实例呢?挂起的析构函数或终结器呢?等。 要使任何一种可用的ENC工作,需要注意许多功能细节。然后有许多跨工具集成问题需要为PowerEnc提供基础结构。特别是,它有助于建立某种调试信息库,使调试信息和对象代码在编辑调试信息和对象代码之前和之后都可用。对于C++,PDBS中增量可更新的调试信息有帮助。增量链接也有帮助。 从MS生态系统到GCC生态系统,很容易想象到GDB/GCC/Binutils中的复杂性和集成问题,无数的目标,一些需要ENC特定的目标抽象,以及ENC的“好但不重要”性质,这就是为什么它还没有出现在GDB/GCC中的原因。 快乐黑客! (P.S.看看smalltalk-80交互式编程环境能做些什么,这很有启发性和启发性。在ST80中,没有“重新启动”的概念——如果您编辑了类的任何方面,您仍然需要继续运行,那么图像及其对象内存始终是活动的。在这样的环境中,对象版本控制不是一个假设。) |
2
11
我不熟悉MSVC的E&C,但是GDB有一些您提到的事情: http://sourceware.org/gdb/current/onlinedocs/gdb/Altering.html#Altering
|
3
3
这是对“修复并继续”的旧苹果实现的一个很好的参考。它还引用了其他工作实现。 http://sources.redhat.com/ml/gdb/2003-06/msg00500.html 下面是一个片段:
请注意,此功能可能已在其工具链的较新版本中删除。 更新日期:2012年12月21日 有一个 GDB Roadmap PDF演示文稿,其中包括描述“修复并继续”以及其他要点的幻灯片。报告日期为2012年7月9日,因此可能有希望在某个时间添加此内容。演讲是 GNU Tools Cauldron 2012 . |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
rainer · 后台插入程序的初始化 1 年前 |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |