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