【问题标题】:Eclipse doesn't display Perl module while debugging (with EPIC)Eclipse 在调试时不显示 Perl 模块(使用 EPIC)
【发布时间】:2013-04-05 21:31:55
【问题描述】:

我正在使用带有 EPIC 插件的 Linux Ubuntu 上运行的 Eclipse GALILEO 来运行/调试 Perl 代码,我在调试时遇到了一些问题。通常,当我进行逐步调试并遇到使用某个 Perl 模块的行时,我单击“Step Into”,然后正在查看模块文件,并且调试箭头也迁移到那里。现在似乎有些模块不遵循这种情况。相反,当我单击“Step Into”时,运行过程正在后台某处进行。我的意思是我可以按“Step Over”,我会看到正在执行的代码的结果,但我看不到文件本身,也看不到箭头。

为了更清楚一点,请参考以下代码:

.
.
if (defined($sysname) && $sysname)
{
$sys_manager->setup_from_name($sysname);
$pf_manager->setup_from_name($sysname);
} else {
die "You must give either a --system parameter or an alias name.";
       }
}
.
.

从头到尾的代码都可以找到here

我执行逐步调试,直到到达$sys_manager->setup_from_name($sysname); 行。当我到达它时,我点击“Step Into”按钮(而不是“Step Over”)。然后我希望在 Eclipse 中再打开一个窗口,它将视图切换到存在此 setup_from_name 方法的模块。但是,正如我之前提到的,“调试箭头”消失了。在这个阶段,如果我点击“Step Over”按钮,运行会在后台某处继续(我可以看到变量正在被修改)。如果我点击“Step Return”,箭头会再次出现并继续通过可见代码。

我还想提一下,这些特定模块是按原样提供的,而不是使用 CPAN 安装的。相对于使用它们的代码的包位置如下:

folder A/    #General folder
  folder B/  #Where the scripts which use the above mentioned modules are located
  folder C/  #Where the modules are located

我希望我的问题足够清楚,但如果不是,请发表评论,我会澄清。

更新 我已启用 EPIC“调试器控制台(实验性)”,并且在调试过程中到达有问题的模块时似乎出现错误。不幸的是,我无法阅读和理解这个调试器数据。该错误是一条很长的消息,部分粘贴在下面:

S00000003$^AS00000002''NS00000003$^DS000000010NS00000003$^ES0000001b'No such file or directory'NS00000003$^FS000000012NS00000003$^HS00000003256NS00000003$^LS00000003

完整的错误信息可通过此link获得

也许这会泄漏一些光..

更新 2 有人建议我验证相关模块路径是否存在于 Eclipse 项目属性中的“Perl 包含路径”中。但不幸的是,我已经这样做了。

【问题讨论】:

  • 显示一些发生这种情况的代码。如果我们不能reproduce the unexpected behaviour,我们只能胡乱猜测出了什么问题。
  • @daxim 添加了代码示例和更多信息。

标签: eclipse perl eclipse-plugin epic


【解决方案1】:

为了让使用相对路径的使用库正常工作,我修补了 Cwd.pm(再次)...添加一个 chomp。


sub fast_abs_path {
    local $ENV{PWD} = $ENV{PWD} || ''; # Guard against clobberage
    my $cwd = getcwd();
    require File::Spec;
    my $path = @_ ? shift : ($Curdir ||= File::Spec->curdir);

    # Detaint else we'll explode in taint mode.  This is safe because
    # we're not doing anything dangerous with it
    ($path) = $path =~ /(.*)/s;
    ($cwd)  = $cwd  =~ /(.*)/s;

    chomp($path);  # <<<-- added this chomp here

    unless (-e $path) {

在 EPIC 代码中可能有一个更好的修复方法,在调用 fast_abs_path 之前进行一次 chomp,但额外的 chomp 不会伤害任何东西...

-大卫

【讨论】:

    【解决方案2】:

    我认为,EPIC 插件无法找到该模块。我只是在这里猜测:

    您是否正确设置了@INC?

    http://www.epic-ide.org/guide/ch03s02.php

    您是否设置了 PadWalker 模块?

    http://www.epic-ide.org/guide/ch02s09.php

    您是否设置/检查了 PERLLIB/PERL5LIB 环境变量?

    【讨论】:

    • 您好,感谢您的 cmets!问题是其余模块(至少是我一直在使用的模块)实际上按预期工作。我的意思是 EPIC 在调试时会跳到相关的 *.pm 文件。关于路径问题,您可能是对的。我将尝试根据您提供的链接中的配置进行检查并更新。再次感谢!
    • 我已尝试按照您提到的用户指南中的说明将模块路径添加到“Perl 包含路径”,但不幸的是它没有帮助。但是,我尝试使用 EPIC“调试器控制台(实验性)”,似乎在到达可能相关的有问题的模块时出现了一些错误。看起来像:NS00000003$^AS00000002''NS00000003$^DS000000010NS00000003$^ES0000001b'No such file or directory'NS00000003$^FS000000012NS00000003$^也许这会提供一些线索?
    • 不知何故找不到模块文件。检查如何调用此模块,它与其他 tahat 的工作方式有何不同。是否有使用 lib '/somepath' 或者您是使用 FindBin 来定位模块还是使用其他方法来查找您的模块?
    • 请向我们展示脚本的第一部分,其中包含您的模块。从 shebang (#!/perl...) 到使用 sys_manager 行。
    • 请找到作为链接添加的完整代码(从头开始)。谢谢!
    【解决方案3】:

    看来我已经意识到如何解决这个问题了。从最初问题中作为链接附加的代码中可以看出,有以下行:

    use lib '..';
    

    这是一个在编译时简化@INC 操作的模块,指向不在其默认路径(/usr/share/perl/5.10.1/)的 Perl 模块。出于某种原因,这些模块可以运行,但我无法“进入”它们。当我将其中一个模块复制到 (/usr/share/perl/5.10.1/) 路径时,我可以在调试期间执行“Step Into”。

    剩下的唯一问题是如何使不在/usr/share/perl/5.10.1/ 中的模块完全可用于调试。但我想这是一个附加问题的主题。

    【讨论】:

    • 我经常遇到这个问题,不知道怎么解决。将“未见过”的模块复制到主项目目录不是一个好的解决方案,这是一个笨拙的解决方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 2023-04-03
    • 2012-03-15
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多