【问题标题】: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。不要使用 requireuse,它们只会在 Perl 文件或模块之前没有加载过的情况下加载。在您的情况下,即使之前已加载,您也希望重新加载。

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

    而且您甚至不需要调试器来执行此操作!许多 Web 框架(如 Ruby on Rails)都有“开发”模式,它们在实现功能的文件上保存时间戳。如果文件已更改,他们会在运行请求之前发出“do”命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-27
      • 1970-01-01
      • 2015-03-01
      • 2013-10-22
      • 1970-01-01
      • 2012-09-21
      相关资源
      最近更新 更多