单步执行供应商提供的库,调用被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“实体”对象的引用和字符串“修改”(两者都适用于该调用)。