在运行时调试时更改代码



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

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

是否有一种方法可以改变子例程中的代码,在调试会话的中间,使得指令指针重置到该子例程的第一行。这样我就不必重新启动会话来重新编译新代码。

感谢你的输入和建议。谢谢你! !

您想做的事情都可以做到,我自己已经用Perl做过很多次了。例如:

然而,尽管你所描述的可能有效(并且有点危险),但通常的完成方式有点不同且更安全。

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

在命令处理器或web服务器中,您读取命令(或获取web请求),执行操作,然后读取另一个命令,执行另一个操作,等等。从你的描述中,听起来你有这样的结构。

在我的例子中,我将每个调试器命令存储在Perl文件中。这不仅有助于简化此任务,而且有助于理解、测试和更改代码。

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

执行此操作的特定Perl结构称为do。不要使用requireuse,它们只会在之前没有加载过的文件或模块中加载。在您的情况下,您希望重新加载,即使它之前已经加载过。

那么现在您如何能够发出do命令呢?正如您所建议的,您可以通过调试器来完成。假设您拥有如上所述的整个程序结构,您可以将断点放在调用程序中的某个公共点,该点循环处理要处理的内容,而不是尝试在单个命令中更改内容。

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

最新更新