【问题标题】:Set arbitrary breakpoint in debugger在调试器中设置任意断点
【发布时间】:2014-11-11 22:07:48
【问题描述】:

我一直在使用 perl 交互式调试器(基本上是perl -d script
我有一个脚本,其中导入了很多模块,我需要调试一个问题。
我所做的是启动调试器并遍历线路,在必要时进入。
但这很乏味,因为我需要进入多行代码和函数调用。

问题:假设在检查完代码行之后,我最终进入了某个模块的函数A::B::C::foo(),我正在调试的问题出在哪里。
有没有办法在调试会话开始时在该函数中设置断点,以便我直接跳转到那里,而不是逐行遍历代码直到到达那里?
我知道我可以在我的调试器当前所在的同一个文件中添加一个断点,但是我如何在此时在调试器范围之外的行中添加一个断点(到一些任意文件/模块,最终调试器会有到达)?

注意:
澄清一下:A::B::C::foo() 并不在脚本的 X 行中。它最终在许多模块中许多其他函数的调用链

之后被调用

【问题讨论】:

  • @ThisSuitIsBlackNot:No.我的问题是我怀疑在我的流程中调用了哪个函数,但代码非常通用,我不确定,我不知道传递的参数代码相当复杂(至少对我而言)
  • 你不需要知道传递给函数的参数,只需要知道函数名。
  • @ThisSuitIsBlackNot:但我需要使用有效值运行该函数才能弄清楚到底发生了什么。也许我错过了你的观点
  • 我不明白您所说的“我需要使用有效值运行函数”是什么意思,但也许您只想在满足某个条件时才中断,您可以使用 @987654324 @,例如b A::B::C::foo $x > 42.

标签: perl debugging module perl-module


【解决方案1】:

您可以使用记录在案的b sub 语法为子例程设置断点。在这种情况下,只需使用

b A::B::C::foo
c

【讨论】:

  • 如果该函数是类函数怎么办?这有什么不同吗?即$object->foo();
  • @Jim,不应该有所作为。在 Perl 中,方法几乎只是一个以对象为第一个参数的函数。如果你知道$obj->foo()调用A::B::foo,那么它和A::B::foo($obj)是一样的。
【解决方案2】:

你可以通过定义文件名和行号来设置断点

b YourModule.pm:line_number

其中行号在您要中断的模块函数内。

【讨论】:

    【解决方案3】:

    您甚至可以使用 postpone 选项在尚未加载/定义的 sub 上设置断点:

    b postpone Name::Of::Sub::Yet::To::Be::Created
    

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 2022-01-06
      • 1970-01-01
      • 2011-01-20
      • 2023-04-05
      • 1970-01-01
      • 2020-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多