我有一个脚本,重定向STDIN/STDOUT到一个文件正常。但是,如果不这样做,调试会更有效。是否有一个$DB:xxx变量或其他东西让脚本知道它可以有不同的行为?
uujelgoq1#
我没有找到任何方法来确定调试器是否直接运行,但您可以使用以下方法检查已知的调试器变量$DB::single是否存在:
$DB::single
if ( $DB::{ single } ) { say "Debugger is running"; }
另一种方法是检查调试器模块是否已加载。
if ( $INC{ "perl5db.pl" } ) { say "Debugger is running"; }
最后,调试器要求Perl在调试支持模式下运行,$^P指示Perl是否处于此模式。
$^P
if ( $^P ) { say "Perl is in debug support mode"; }
调试器并不是唯一需要将Perl置于调试支持模式的工具。其他包括Devel::NYTProf、Devel::Cover、Devel::Trace等。因此,这种方法不能用于专门检查调试器是否正在运行。但这可能是你真正想要的。
ubbxdtey2#
在阅读www.example.com(perldoc -m DB)的Perl源代码DB.pm时,我注意到$SIG{INT}在末尾被全局设置。这似乎是可行的,至少对于一个简单的程序:
perldoc -m DB
$SIG{INT}
if (\&DB::catch && $SIG{'INT'} && $SIG{'INT'} == \&DB::catch) { say "Debugging ?" }
如果它不适用,我想可以子类化DB.pm并创建一个简单的调试器,它覆盖cont并进行额外的簿记。
cont
jexiocij3#
要发现你的脚本在调试器下,你需要检查:$^P变量:
if ( $^P ) { # running under a debugger }
https://perldoc.perl.org/perldebug#Calling-the-Debugger如果你的脚本在没有-d选项的情况下运行,那么$DB::single将不会执行任何操作。根据文档,最小的调试器是sub DB::DB {}。因此,另一种检查脚本是否处于调试器下的方法是:
-d
sub DB::DB {}
if( defined &DB::DB ){ # running under a debugger }
j91ykkif4#
这两个都对我正在做的事情很有用。我会把它放在我的Perl备忘单上。
if ( $INC{ "perl5db.pl" } ) { say "Debugger is running"; } if ( $^P ) { say "Perl is in debug support mode"; }
4条答案
按热度按时间uujelgoq1#
我没有找到任何方法来确定调试器是否直接运行,但您可以使用以下方法检查已知的调试器变量
$DB::single
是否存在:另一种方法是检查调试器模块是否已加载。
最后,调试器要求Perl在调试支持模式下运行,
$^P
指示Perl是否处于此模式。调试器并不是唯一需要将Perl置于调试支持模式的工具。其他包括Devel::NYTProf、Devel::Cover、Devel::Trace等。因此,这种方法不能用于专门检查调试器是否正在运行。但这可能是你真正想要的。
ubbxdtey2#
在阅读www.example.com(
perldoc -m DB
)的Perl源代码DB.pm时,我注意到$SIG{INT}
在末尾被全局设置。这似乎是可行的,至少对于一个简单的程序:
如果它不适用,我想可以子类化DB.pm并创建一个简单的调试器,它覆盖
cont
并进行额外的簿记。jexiocij3#
要发现你的脚本在调试器下,你需要检查:
$^P
变量:https://perldoc.perl.org/perldebug#Calling-the-Debugger
如果你的脚本在没有
-d
选项的情况下运行,那么$DB::single
将不会执行任何操作。根据文档,最小的调试器是
sub DB::DB {}
。因此,另一种检查脚本是否处于调试器下的方法是:
j91ykkif4#
这两个都对我正在做的事情很有用。我会把它放在我的Perl备忘单上。