在调试会话期间修改代码。

3

有没有人知道一种调试器或编程语言,可以设置断点,然后修改代码并执行新修改的代码。

如果调试器还具有反向调试的功能,那就更有用了。这样,您可以逐步查看有错误的代码,向后堆栈,修复代码,然后再次逐步查看以查看是否已修复错误。那真是太棒了,有人在做这个吗?


可能可以在Visual Studio 2010中使用x86汇编语言完成此操作。请参见此处:http://stackoverflow.com/questions/15556286/edit-assembly-language-code-in-visual-studio-while-stepping-through-each-stateme/15556693?noredirect=1#15556693 - Anderson Green
您应该添加一个“实时编程”标签,因为这是指实时程序更改的传播方式 - 可以参考我的论文,在我更新后的答案中引用。 - Abraham
4个回答

2
调试器提供了“评估点”(Evaluation Point)的概念,允许用户“即时修复代码”,或“修补”代码,或者在不需要重新编译的情况下检查“假如”的情形。
基本上,用户在某一行放置一个“评估点”,并编写他想要执行的C/C++或Fortran代码。这可能是一个简单的printfgoto,一组if-then-else测试,一些for循环等等... 这真的非常强大和节省时间。
至于,它是一个非常理想的功能,但我不确定它是否已经存在。

2
我相信你所说的问题是关于Eclipse中的热代码替换(Hot Code Replace):http://wiki.eclipse.org/FAQ_What_is_hot_code_replace%3F 其思想是,您可以在运行时调试工作台上启动一个调试会话,并更改开发工作台中的Java文件,而调试器将在接收VM运行时替换代码。无需重新启动,因此称之为“热替换”。
但是有一些限制:
HCR仅在类签名未更改时有效;例如,您不能删除或添加现有类的字段。但是,HCR可用于更改方法体。

1
2015年修改:阅读我的硕士论文第1章和第2章,结合反向调试和实时编程以实现计算机编程中的可视化思维,它详细回答了这个问题。

Python调试器Pdb允许您在暂停时运行任意代码(如在断点处)。例如,假设您正在调试并已暂停在程序中未声明变量的以下行:

print (x)

因此向前移动(即运行那行代码)将导致:

NameError: name 'x' is not defined

您可以在调试器中定义该变量,并使程序继续使用它执行:
(Pdb) 'x' in locals()
False
(Pdb) x = 1
(Pdb) 'x' in locals()
True

如果你的意思是更改不应该在调试器控制台中提供,而是想要在某个编辑器中更改原始代码,然后让调试器以某种方式自动更新实时程序的状态,使执行的程序反映出该更改,这就是所谓的“实时编程”。(不要与“现场编码”混淆,后者是编码的现场表演--请参见TOPLAP--尽管存在一些混淆。)在过去的2或3年中,对实时编程(和现场编码)进行了研究。这是一个非常困难的问题,有许多不同的方法。您可以观看Bret Victor的讲话Inventing on Principle,其中提供了一些示例。请注意,这些仅是原型,用于说明这个想法。代码的热交换,使得树在下一次draw()函数循环中以不同的方式绘制,或者使得游戏角色下一次响应不同(或者在现场编码会话期间更改音乐或视觉效果),并不那么困难,一些语言和系统明确支持这种操作。然而,程序的状态不一定是代码的真实反映(如上面的Pdb示例)--例如,如果游戏角色可以基于跳跃等能力访问某个区域,并且然后交换代码,他可能再也无法访问该区域如果从头开始玩游戏。解决一般编程的变更传播是困难的--您可以看到他的搜索示例每次进行更改时都会重新运行代码。

真正的反向执行也是一个棘手的问题。有许多商业项目,但几乎所有这些项目都只记录跟踪数据以便后续浏览,称为全知调试(但它们通常被称为反向、回溯、双向或时间旅行调试器,也存在很多混淆)。在免费和开源项目方面,GNU调试器gdb有两种模式,一种是进程记录和重放,也只记录程序以便后续浏览,另一种是真正的反向调试,允许您在实时程序中进行反向操作。它非常缓慢,因为它每次只撤消单个机器指令。扩展的Python调试器原型epdb也允许在实时程序中进行真正的反向操作,并且速度更快,因为它使用了快照/检查点和重放机制。这里是论文,这里是程序和代码


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接