Один из моих главных объектов неприязни с отладкой кода Perl (в отладчике командной строки, perl -d
) то, что по ошибке печать (через x
команда) содержание огромного datastructure, как гарантируют, замерзнет Ваш терминал для навсегда с половиной, в то время как 100 с страниц данных печатаются. Epecially, если это происходит через достаточно медленную сеть.
По сути, я хотел бы смочь ограничить объем данных это x
печать.
Я вижу два подхода - я был бы готов попробовать также, если кто-то знает, как сделать.
Ограничьте объем данных любая единственная команда в печати отладчика.
Еще лучше так или иначе замените встроенное x
команда с пользовательским методом Perl (который вычислил бы "размер" структуры данных и отказался бы печатать ее содержание без подтверждения).
Я конкретно спрашиваю, "как заменить x
с пользовательским кодом" - создание Достаточно хорошего "является структурой данных, слишком большой" метод Perl - что-то, что я могу, вероятно, сделать самостоятельно без слишком большого усилия, хотя я вижу, что достаточно ловушек препятствует тому, чтобы "идеальный" был довольно расстраивающим усилием. Heck, просто делая Данные:: самосвал-> Дамп и взятие длины строки мог бы добиться цели :)
Обратите внимание на то, что я отлично знаю, как вручную избежать проблемы путем рекурсивного исследования слоев datastructure (например, распечатать касательно, распечатайте количество ключей/элементов массива, и т.д....)... самое главное, я хочу смочь постараться не неосмотрительно вводить x $huge_pile_of_data
не думая - или натыкаясь на ошибку, заполняющую, сказал, что огромная груда данных в то, что должно быть скаляром.
Команда |
в отладчике направляет вывод другой команды на ваш пейджер, например.
DB<1> |x %huge_datastructure
Команда 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()
sub, который она определяет). Вы можете изменить/заменить этот скрипт по своему усмотрению. Однако я не уверен, как вы сделаете его интерактивным.