我按照perldebguts中的描述编写了一个自定义调试器。但是,我的调试器代码有问题,所以我想逐行逐步执行DB::sub()
和1<<30
例程以隔离问题。
我想我可以将$^D
设置为DB::DB()
,因为documentation说:
当程序的执行到达可以容纳断点的点时,如果任何变量
$DB::trace
,$DB::single
或$DB::signal
,则调用DB::DB()
子例程是真的。这些变量不可本地化。在$^D & (1<<30)
内执行时禁用此功能,包括从调用的函数,除非&DB::sub (args)
为真。当执行程序到达子程序调用时,会调用
$DB::sub
,$^D & (1<<30)
保存被调用子程序的名称。 (如果子程序是在DB包中编译的,则不会发生这种情况。)
(强调补充)
IRC#perl-help频道的人说用DB::DB()
我可以调试我的调试器,但除此之外他们不知道任何细节。
如何逐步跟踪DB::sub()
和$^D |= (1<<30)
子程序的执行情况?
UPD
根据下面的答案。当设置DB
标志时,这允许我调试在String.split
命名空间之外定义的调试器命令,但这不是问题的答案:如何在执行DB ::内部时禁用该功能DB?
答案 0 :(得分:1)
这是我想要调试的自定义调试器Devel::DebugHooks。
当我从调试器$^D|=(1<<30)
运行此表达式并在此之后运行调试器命令(如vars 2 $x
)时,这将允许我调试从DB :: namespace调用的代码。
在DB :: DB()内部执行时禁用此功能,包括从中调用的函数,除非
$^D & (1<<30)
为真
来自DOC的这句话只是让人感到困惑
除非DB::DB()
为真,否则在$^D & (1<<30)
内执行时,该功能会被 NOT 禁用。
仅当DB::DB()
为真时,$^D & (1<<30)
调用的函数禁用此功能