debugging Perl脚本如何知道它是否在调试器中运行?

7xllpg7q  于 2023-05-13  发布在  Perl
关注(0)|答案(4)|浏览(176)

我有一个脚本,重定向STDIN/STDOUT到一个文件正常。但是,如果不这样做,调试会更有效。是否有一个$DB:xxx变量或其他东西让脚本知道它可以有不同的行为?

uujelgoq

uujelgoq1#

我没有找到任何方法来确定调试器是否直接运行,但您可以使用以下方法检查已知的调试器变量$DB::single是否存在:

if ( $DB::{ single } ) {
   say "Debugger is running";
}

另一种方法是检查调试器模块是否已加载。

if ( $INC{ "perl5db.pl" } ) {
   say "Debugger is running";
}

最后,调试器要求Perl在调试支持模式下运行,$^P指示Perl是否处于此模式。

if ( $^P ) {
   say "Perl is in debug support mode";
}

调试器并不是唯一需要将Perl置于调试支持模式的工具。其他包括Devel::NYTProf、Devel::Cover、Devel::Trace等。因此,这种方法不能用于专门检查调试器是否正在运行。但这可能是你真正想要的。

ubbxdtey

ubbxdtey2#

在阅读www.example.com(perldoc -m DB)的Perl源代码DB.pm时,我注意到$SIG{INT}在末尾被全局设置。
这似乎是可行的,至少对于一个简单的程序:

if (\&DB::catch && $SIG{'INT'} && $SIG{'INT'} == \&DB::catch) {
    say "Debugging ?"
}

如果它不适用,我想可以子类化DB.pm并创建一个简单的调试器,它覆盖cont并进行额外的簿记。

jexiocij

jexiocij3#

要发现你的脚本在调试器下,你需要检查:$^P变量:

if ( $^P ) {
    # running under a debugger
}

https://perldoc.perl.org/perldebug#Calling-the-Debugger
如果你的脚本在没有-d选项的情况下运行,那么$DB::single将不会执行任何操作。
根据文档,最小的调试器是sub DB::DB {}
因此,另一种检查脚本是否处于调试器下的方法是:

if( defined &DB::DB ){
   # running under a debugger
}
j91ykkif

j91ykkif4#

这两个都对我正在做的事情很有用。我会把它放在我的Perl备忘单上。

if ( $INC{ "perl5db.pl" } ) {
   say "Debugger is running";
}

if ( $^P ) {
   say "Perl is in debug support mode";
}

相关问题