是否有可能在perl应用程序中打开-d标志并将其应用于自身?



我想在perl程序中使用类似Devel::Trace的东西来捕获程序正在做的事情,但是我想让应用程序自己打开它。在特定的。我希望这个程序能够自我测试。我想捕获程序在自测模式下的操作日志,然后用它们来验证程序是否正常运行。我想从程序内部完成,这样我就可以访问程序收集的其他信息,也就是说,不仅仅是跟踪。而且,我不想一直使用-d开关。

我想我可以让程序递归地调用自己与-d开关,如果它发现它应该自测,它还没有在它是开的状态。我想应该有办法检测出来。这有点笨拙,但可能足够了。

目前自检大多数都是递归地调用main,和main调用的函数是一样的,但是传入了自己的参数列表来代替ARGV。但是,它也可以通过覆盖变量与其他模块进行交互,例如实现mock,所以我宁愿留在同一个解释器中,只是打开对&DB.DB的调用,以便我可以捕获函数何时被调用和退出等。

当使用-d时,$^P为true。

BEGIN { exec $^X, "-d:Trace", "--", $0, @ARGV if !$^P }

你也可以使用

#!/usr/bin/perl -d:Trace
=== update

我想在perl程序中使用类似Devel::Trace的东西来捕获程序正在做的事情,但是我想让应用程序自己打开它。

看完评论后,我认为你对调试器和Devel::Trace是如何交互的感到困惑,需要一些澄清。

perl -d在调试模式下启动Perl,它将不断调用调试器的DB::名称空间中的例程,主要是&DB::DB的每个语句。"default"调试器是perl5db.pl,但您可以在-d开关之后或通过设置ENV变量指定另一个。

这就是Devel::Trace是如何实现的,查看源代码,它只有30行长。从技术上讲,它只是一个调试器。

参见https://perldoc.perl.org/perldebguts#Writing-Your-Own-Debugger

现在你有两个选择:

  1. 你可以写你自己的&DB::DB,它检查像$DB::MyTrace这样的标志变量,你可以交互式地设置为"打开"。并在恒定调试模式下打破沉默。
  2. 你使用Enbugger->load_debugger动态加载MyTrace。点模块。

这里有一个问题:激活-d会使Perl相当慢(~ 10?),所以要么选择选项

  1. 如果您可以控制需要跟踪的场景,并且可以接受较慢的执行。
  2. 是可以的,如果你不能,一个依赖于XS模块,如Enbugger是可以的,也就是说,性能损失只会在出现bug的情况下影响你的生产代码。
<编辑>= = =原

我想你想试试Enbugger

From the docs:

Enbugger -在运行时启用调试器。

my $ok = eval { ...; 1 };
if ( not $ok ) {
# Oops! there was an error! Enable the debugger now!
require Enbugger;
Enbugger->stop;
}

最新更新