Ограничение объема информации, выводимой отладчиком Perl - PullRequest
5 голосов
/ 02 марта 2010

Одной из моих любимых мозолей с отладкой кода Perl (в командной строке debbugger, perl -d) является тот факт, что ошибочная печать (с помощью команды x) содержимого огромной структуры данных гарантированно замораживает ваш терминал навсегда с половиной, а сотни страниц данных печатаются. Особенно, если это происходит в медленной сети.

Как таковой, я хотел бы иметь возможность ограничить объем данных, которые x печатает.

Я вижу два подхода - я хотел бы попробовать любой, если кто-то знает, как это сделать.

  1. Ограничить объем данных, который выводит любая отдельная команда в отладчике.

  2. Еще лучше: каким-то образом заменить встроенную команду x на собственный метод Perl (который вычислит «размер» структуры данных и откажется печатать ее содержимое без подтверждения).

Я специально спрашиваю "как заменить x пользовательским кодом" - создание Good Enough "- это слишком большая структура данных" Perl-метод - это то, что я, вероятно, могу сделать самостоятельно без особых усилий, хотя вижу достаточно ловушек, мешающих «идеальному» быть довольно разочаровывающим занятием. Черт возьми, простое выполнение Data :: Dumper-> Dump и получение длины строки может помочь:)

Обратите внимание, что я прекрасно знаю, как вручную избежать этой проблемы, рекурсивно исследуя слои структуры данных (например, распечатывать ссылку, печатать количество ключей / элементов массива и т. Д.) ... в целом Суть в том, что я хочу избежать бездумного ввода x $huge_pile_of_data, не задумываясь - или наткнуться на ошибку, заполняющую огромную кучу данных в скаляр.

Ответы [ 2 ]

12 голосов
/ 02 марта 2010

Команда 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(), которую она определяет). Вы можете изменить / заменить этот скрипт по своему усмотрению. Я не уверен, как бы вы сделали это интерактивным.

8 голосов
/ 02 марта 2010

Команда | в отладчике передает выходные данные другой команды на ваш пейджер, например,

  DB<1> |x %huge_datastructure
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...