有谁知道允许您设置断点,然后修改代码然后执行新修改的代码的调试器或编程语言。
如果 Debugger 还具有反向调试的能力,这将更加有用。所以你可以单步调试有缺陷的代码,向后堆栈,修复代码,然后再单步调试,看看你是否修复了错误。现在这很性感,有人这样做吗?
有谁知道允许您设置断点,然后修改代码然后执行新修改的代码的调试器或编程语言。
如果 Debugger 还具有反向调试的能力,这将更加有用。所以你可以单步调试有缺陷的代码,向后堆栈,修复代码,然后再单步调试,看看你是否修复了错误。现在这很性感,有人这样做吗?
totalview调试器提供了评估点的概念,它允许用户“即时修复他的代码”或“修补它”或检查假设场景而无需重新编译。
基本上,用户在某行放置一个评估点,然后编写一段他想要执行的 C/C++ 或 Fortran 代码。可能是一个简单的printf
, goto
,一组if
-测试,一些then
循环等......这真的很强大而且节省时间。else
for
至于reverse-debugging,这是一个非常理想的功能,但我不确定它是否已经存在。
我相信 Eclipse 中的Hot Code Replace是您在问题中的意思:
这个想法是,您可以在给定的运行时工作台上启动调试会话并在开发工作台中更改 Java 文件,并且调试器将在接收 VM 运行时替换其代码。不需要重新启动,因此提到了“热”。
但是有一些限制:
HCR 仅在类签名不变时起作用;例如,您不能删除或向现有类添加字段。但是,HCR 可用于更改方法的主体。
http://msdn.microsoft.com/en-us/library/bcew296c%28v=vs.80%29.aspx
该链接适用于 VS 2005,但也适用于 2008 和 2010。
编辑,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 的演讲,根据原则进行发明, 举一些例子。请注意,这些只是原型,以说明这个想法。代码的热交换,以便在某个 draw() 函数的下一个循环中以不同方式绘制树,或者使游戏角色下一次做出不同的响应,(或者在实时编码会话期间更改音乐或视觉效果) ,并不难,一些语言和系统明确地满足了这一点。然而,程序的状态不一定是代码的真实反映(同样在上面的 Pdb 示例中)——例如,如果游戏角色可以基于跳跃等能力访问某个区域,然后交换代码如果从一开始就玩游戏,他可能永远无法进入游戏中的那个区域. 解决一般编程的更改传播是困难的——您可以看到他的搜索示例在每次进行更改时从头开始重新运行代码。
真正的反向执行也是一个棘手的问题。有很多商业项目,但几乎都只记录跟踪数据以供事后浏览,称为全知调试(但它们通常被称为反向、回溯、双向或时间旅行调试器,也很多混乱)。在免费和开源项目方面,GNU调试器gdb有两种模式,一种是进程记录和回放,也只是记录程序供以后浏览,另一种是真正的逆向调试它允许您在现场节目中反转。它非常慢,因为它一次撤消单个机器指令。扩展的 python 调试器原型 epdb 还允许在实时程序中进行真正的反转,并且由于它使用快照/检查点和重放机制而速度更快。这是论文,这是程序和代码。