调试时在运行时更改代码

时间:2014-05-21 18:23:06

标签: eclipse perl debugging compilation epic

我正在使用 Eclipse Kepler Service Release 2,EPIC 0.5.46 和Strawberry Perl 5版本18进行perl编程。对于调试,我使用 Eclipse调试器和PadWalker

我有一个交互式perl程序,它根据用户提供的答案写入文件到多个提示。在调试时,每次我改变一行代码时,我都必须重新运行整个程序,并为每个提示提供输入,这非常耗时。

有没有办法在调试会话中间对子例程中的代码进行更改,以便指令指针将自身重置为该子例程的第一行。这样我不必重新启动会话以重新编译新代码。

感谢您的意见和建议。谢谢!!!

1 个答案:

答案 0 :(得分:1)

你想做什么,我自己在Perl做了很多次。例如,请参阅this

然而,尽管你所描述的内容可能有用(而且有点危险),但它的处理方式通常有点不同且更安全。

首先必须假设一种常规的命令结构,如命令处理器,或者说是Web服务器。

在命令处理器或Web服务器中,您可以读取命令(或获取Web请求),执行操作,然后读取其他命令,执行其他操作等。根据你的描述,听起来你有这样的结构。

就我而言,我将每个调试器命令存储在Perl文件中。这不仅有助于促进此任务,还有助于理解,测试和更改代码。

鉴于这种程序结构,您可以完成命令,而不是尝试更改程序计数器,在您要读取新命令的级别上,进行更改,然后重新加载更改代码的文件

执行此操作的特定Perl构造称为 do 。不要使用要求使用,只有在先前未加载该文件或模块的情况下才会加载Perl文件。在您的情况下,即使之前已加载,也要重新加载。

那么现在如何才能发出 do 命令?如你所知,你可以通过调试器来完成。假设你有如上所述的整体程序结构,你将断点放在调用者中的一个公共点,它循环处理事物,而不是尝试用单独的命令改变事物。

你甚至不需要调试器就可以做到这一点!像Ruby on Rails这样的许多Web框架都有一个"开发"模式,它们在实现功能的文件上保存时间戳。如果文件已更改,则会发出" do"在运行请求之前执行命令。