【问题标题】:Changing Code At Runtime While Debugging调试时在运行时更改代码
【发布时间】:2015-05-19 07:48:11
【问题描述】:
我正在使用 Eclipse Kepler Service Release 2、EPIC 0.5.46 和 Strawberry Perl 5 第 18 版进行 perl 编程。对于调试,我使用 Eclipse 调试器和 PadWalker 。
我有一个交互式 perl 程序,它根据用户对多个提示提供的答案写入文件。调试时,每次修改一行代码,我都必须重新运行整个程序,并为每个提示提供输入,这真的很耗时。
有没有办法在调试会话的中间对子例程中的代码进行更改,以便指令指针将自身重置到该子例程的第一行。这样我不必重新启动会话即可重新编译新代码。
感谢您的意见和建议。谢谢!!!
【问题讨论】:
标签:
eclipse
perl
debugging
compilation
epic
【解决方案1】:
你想做的事都可以做到,我自己在 Perl 中做过很多次。例如,请参阅this。
但是,尽管您描述的方法可能有效(并且有点危险),但通常执行的方式有点不同且更安全。
首先必须假设一种常规的命令结构,例如命令处理器,或者说是 Web 服务器。
在命令处理器或 Web 服务器中,您读取一个命令(或获取一个 Web 请求),执行一个操作,然后读取另一个命令,执行另一个操作等等。从你的描述看,好像你有这样的结构。
就我而言,我将每个调试器命令都存储在 Perl 文件中。这不仅有助于促进这项任务,而且有助于理解、测试和更改代码。
鉴于这种程序结构,您无需尝试更改程序计数器,而是完成命令并在即将读取新命令的级别进行更改,然后重新加载更改代码的文件.
执行此操作的特定 Perl 构造称为 do。不要使用 require 或 use,它们只会在 Perl 文件或模块之前没有加载过的情况下加载。在您的情况下,即使之前已加载,您也希望重新加载。
那么现在你如何才能发出 do 命令呢?正如您所建议的,您可以通过调试器来完成。假设您具有如上所述的整体程序结构,您将断点放置在调用者中的某个公共点处,该点循环处理要处理的内容,而不是尝试在单个命令中更改内容。
而且您甚至不需要调试器来执行此操作!许多 Web 框架(如 Ruby on Rails)都有“开发”模式,它们在实现功能的文件上保存时间戳。如果文件已更改,他们会在运行请求之前发出“do”命令。