如何调试自定义调试器?

时间:2016-03-18 18:11:55

标签: perl debugging

我按照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?

1 个答案:

答案 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)调用的函数禁用此功能