【问题标题】:Limiting the amount of information printed by Perl debugger限制 Perl 调试器打印的信息量
【发布时间】:2010-03-03 00:11:09
【问题描述】:

在调试 Perl 代码(在命令行调试器中,perl -d)时,我最讨厌的一个事实是,错误地打印(通过x 命令)一个巨大的数据结构的内容肯定会永远冻结你的终端半时打印了 100 页数据。特别是如果这种情况发生在速度较慢的网络中。

因此,我希望能够限制x 打印的数据量。

我看到了两种方法 - 如果有人知道该怎么做,我愿意尝试任何一种。

  1. 限制调试器打印中任何单个命令的数据量。

  2. 更好的是,以某种方式将内置的x 命令替换为自定义 Perl 方法(该方法将计算数据结构的“大小”,并拒绝在未经确认的情况下打印其内容)。

我特别问“如何用自定义代码替换 x”- 构建一个足够好的“数据结构是否太大”Perl 方法是我可以自己做的事情,虽然我看到了足够多的陷阱阻止“完美”的努力成为一项相当令人沮丧的努力。哎呀,仅仅做 Data::Dumper->Dump 并获取字符串的长度就可以了:)

请注意,我非常清楚如何通过递归检查数据结构层来手动避免该问题(例如打印 ref、打印键/数组元素的计数等...)...关键是我希望能够避免不加思索地输入x $huge_pile_of_data - 或者在将所述大量数据填充为标量的错误时绊倒。

【问题讨论】:

  • 我经常使用你问题中提到的简单方法,将这个子程序添加到我正在调试的代码中:sub xx { use Data::Dumper; print Dumper(@_) }。然后我在调试器中使用xx $foo 而不是x $foo。正如你所说,一个人可以通过在打印前检查长度来使xx() 提供更全面的服务。
  • @FM - 但这假设您有远见,知道 $foo 很大。我的整个问题都是偶然发生的。
  • 我的建议并不要求你假设任何关于$foo 的事情。相反,它需要改变习惯:一直使用xx,而不是x——主要是因为Data::Dumper 的输出比x 的输出更好,还因为使用您自己的转储子程序可以轻松根据手头问题的需要自定义行为。当然,这只是一个想法。

标签: perl debugging


【解决方案1】:

x 命令采用可选参数来表示要显示的最大深度。这与将数据量限制为 N 页并不完全相同,但对于防止过载绝对有用。

  DB<1> %h = (a => { b => { c => 1 } } )

  DB<2> x %h
0  'a'
1  HASH(0x1d5ff44)
   'b' => HASH(0x1d61424)
      'c' => 1

  DB<3> x 2 %h
0  'a'
1  HASH(0x1d5ff44)
   'b' => HASH(0x1d61424)

您可以通过o 命令指定默认打印深度,例如

DB<1>o dumpDepth=1

将其添加到您的 .perldb 文件以将其应用于所有调试器会话。

否则,看起来x 命令调用了DB::dumpit(),它只是dumpval.pl 的包装器(或者,更具体地说,它定义的main::dumpValue() 子)。您可以根据需要修改/替换该脚本。不过,我不确定你会如何使它具有交互性。

【讨论】:

    【解决方案2】:

    调试器中的| 命令通过管道将另一个命令的输出传送到您的寻呼机,例如

     DB |x %huge_datastructure

    【讨论】:

    • 含义:优点是巨大的输出将被发送到寻呼机(如less),您可以指示寻呼机退出并丢弃x %huge_datastructure的现有和未来输出.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多