有没有人知道调试器或编程语言允许您设置断点,然后修改代码然后执行新修改的代码。
如果调试器还具有reverse debugging的能力,这将更有用。所以你可以通过有缺陷的代码,向后堆栈,修复代码,然后再次执行它以查看是否修复了错误。现在这很性感,有人这样做吗?
答案 0 :(得分:2)
我相信日食中的Hot Code Replace就是你在问题中的含义:
您的想法是可以在给定的运行时启动调试会话 工作台并更改开发工作台中的Java文件,以及 调试器将替换接收VM中的代码 运行。不需要重新启动,因此引用了" hot"。
但有一些限制:
HCR仅在班级签名不变时才有效;你不能 例如,删除或添加现有类的字段。但是,HCR 可以用来改变方法的主体。
答案 1 :(得分:2)
totalview调试器提供评估点的概念,允许用户“动态修复代码”或“修补它”或检查如果< / em>场景,无需重新编译。
基本上,用户在某行生成评估点,并编写一段他想要执行的C / C ++或Fortran代码。可以是一个简单的printf
,goto
,一组if
- then
- else
测试,一些for
循环等...是非常强大和节省时间。
至于reverse-debugging,这是一个非常理想的功能,但我不确定它是否已经存在。
答案 2 :(得分:1)
http://msdn.microsoft.com/en-us/library/bcew296c%28v=vs.80%29.aspx
该链接适用于VS 2005,但也适用于2008年和2010年。
答案 3 :(得分:0)
编辑,2015:阅读我的硕士论文的第1章和第2章Combining reverse debugging and live programming towards visual thinking in computer programming,它会详细回答这个问题。
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有两种模式,一种是process record and replay,它只记录程序以便以后浏览它,另一种是真reverse debugging允许你在现场节目中扭转。它非常慢,因为它一次撤消单机指令。扩展的python调试器原型epdb也允许在实时程序中进行真正的反转,并且因为它使用快照/检查点和重放机制而更快。这是thesis,这里是program and the code。