3

单步执行供应商提供的库,调用被AUTOLOAD'ed,coderef 由 a 捕获UNIVERSAL::can(),然后调用该 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“实体”对象的引用和字符串“修改”(两者都适用于该调用)。

4

1 回答 1

0

最好的方法是简单地用 C 语言编写一个测试程序,然后模拟您在 Perl 中尝试执行的操作。我希望有一种更好的方法来调试通过 DynaLoader 运行的 C 代码,但到目前为止我还没有见过。我还刚刚破解了 Perl 调试器的袖珍参考资料,我没有看到任何提到 DynaLoader。

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

于 2013-08-23T18:31:03.143 回答