调试调用DynaLoader库的AUTOLOAD

时间:2012-08-15 16:13:33

标签: perl debugging

单步调试供应商提供的库,调用AUTOLOAD',由UNIVERSAL::can()捕获的coderef,以及调用的coderef。我相信通过DynaLoader从编译库中调用例程。

问题是,当它到达这一行$result = &$coderef(@args)时,调试器不会介入任何coderef,它只需要我到模块本身的下一行。但是,我被警告Use of uninitialized value in string ne at (eval 1) line 1670,这让我觉得coderef不仅仅是对外部库的调用。

我已经手动尝试s $coderef->(@args)并“踩到”它,这是同样的警告,没有其他与电话的互动。

有没有办法证明这是一个包装器,甚至可能强迫调试器在其中查看?

编辑更多代码上下文(来自CQPerlExt.pm的基本修整例程,IBM ClearQuest Perl API):

sub AUTOLOAD {
    my @args = @_;
    (my $sub = $AUTOLOAD) =~ s/::/_/g;
    my $coderef = UNIVERSAL::can(__PACKAGE__."c", $sub)
        or Carp::croak "Undefined subroutine &$AUTOLOAD called";

    my $result = &$coderef(@args);
    return $result;
}

它有效,预期的例程会按照预期执行,但在第7行执行时会发出警告。调试器''直到第8行。

有一个CQPerlExtc包,它是外部库的引导程序。

在这种情况下,@ args包含对ClearQuest“entity”对象的引用,以及字符串'modify'(两者都适合此调用)。

1 个答案:

答案 0 :(得分:0)

最好的方法是在C中编写一个测试程序,然后模拟你在Perl中尝试做的事情。我希望有更好的方法来调试通过DynaLoader运行的C代码,但到目前为止我还没有看到一个。我也刚刚破解了Perl调试器的口袋参考,我没有看到任何提到DynaLoader。

我只是将它拉入调试器,将传递给C函数的值复制到C程序中,然后在其上运行gdb。