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

ebdffaop  于 2023-04-21  发布在  Perl
关注(0)|答案(2)|浏览(150)

我想在perl程序中使用类似Devel::Trace的东西来捕获程序正在做的事情,但我希望应用程序能够自己打开它。具体来说,我希望程序能够进行自检。我想捕获程序在自检模式下所做的事情的日志,然后使用它们来验证程序是否正常运行。我想从程序内部完成这项工作,这样我就可以访问程序收集的其他信息,即不仅仅是跟踪。而且,我不想一直使用-d开关。
我想如果程序发现它应该进行自检,但它还没有处于开启状态,我可以让它用-d开关递归地调用自己。我想有一种方法可以检测到这一点。这有点笨拙,但可能足够了。
目前,自检大多数递归调用main,以及相同的函数main调用,但传入自己的参数列表来替换ARGV。但是,它也可以通过覆盖变量与其他模块交互,例如实现mocking,所以我宁愿留在同一个解释器中,只是打开对& DB.DB的调用,这样我就可以捕获函数何时被调用和退出等。

vxf3dgd4

vxf3dgd41#

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

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

您还可以使用

#!/usr/bin/perl -d:Trace
oogrdqng

oogrdqng2#

===更新

我想在perl程序中使用类似Devel::Trace的东西来捕获程序正在做的事情,但我希望应用程序自己打开它。
在阅读了这些评论之后,我认为您对调试器和Devel::Trace如何交互感到困惑,需要进行一些澄清。
perl -d在调试模式下启动Perl,它会不断调用调试器的DB::命名空间中的例程,大多数情况下每个语句都是&DB::DB。“默认”调试器是perl5db.pl,但您可以在-d开关之后或通过设置ENV变量来指定另一个调试器。
这就是Devel::Trace的实现方式,看看源代码,它只有30行,从技术上讲,它只是一个调试器。
另见https://perldoc.perl.org/perldebguts#Writing-Your-Own-Debugger
现在你有两个选择:
1.您可以编写自己的&DB::DB,它检查一个标志变量,如$DB::MyTrace,您可以交互地设置为“打开它”,并在恒定调试模式下打破沉默。
1.使用Enbugger->load_debugger动态加载MyTrace.pm模块。
这是一个陷阱:激活-d会使Perl变得相当慢(~ 10?),所以选择选项
1.如果你能控制你需要跟踪的场景,那么较慢的执行速度是可以接受的。
1.如果你不能,那么就可以,而对Enbugger这样的XS模块的依赖也可以,即性能损失只会在出现bug的情况下影响你的生产代码。

===原创

我想你应该试试Enbugger
从文档:
Enbugger -在运行时启用调试器。

my $ok = eval { ...; 1 };

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

相关问题