perldebug Часть 1

Анастасия

perldebug Часть 1

Запуск отладчика:
perl -d file.pl arg1=val1 arg2=val2

Самые полезные команды:

p - print.
x - дамп, отличается от p тем, что распечатывает содержимое ссылок. Если хэш содержит вложенную ссылку на самого себя, отмечает ее REUSED_ADDRESS.

Опции для форматирования результатов x:
arraydepth - глубина вложенности массивов
compactdump - количество пробелов в отступах
verycompact - меньше пробелов в отступах
dumpdepth - глубина вложенности хэшей
dumpdfiles - настраивает показ файлов в командах X и V
dumpreused - как показывать циклические ссылки
Опции настраиваются так:
o arraydepth=2
Узнать значение:
o arraydepth?
o arrayd? - тоже работает

f ModuleName - показывает содержимое этого файла.
l - показывает несколько строк кода, варианты:
l min+incr - incr+1 строк, начиная с min,
l min-max - все строки с min до max,
l line - одну строку с номером line,
l sub - несколько первых строк функции sub,
l $var - первое упоминание $var,
l - следующие несколько строк.
. - показывает строку, которая сейчас будет выполнятся.
- - показывает несколько предыдущих строк.
S regexp - список подпрограмм, например S BEGIN, S ![abc].
V module regexp - показывает переменные, V main x.
X - тоже самое, что и V currentpackage [vars].
i - дерево наследования: use ModuleName \n i ModuleName.
H - показать историю вводимых команд.
!5 - повторить команду номер 6 из истории команд.
!! - повторить наиболее часто вызываемую команду.

q - выход, еще ctrl-D.

с line - выполнять до строки с номером line.
n - выполнить следующую строку.
s - step into, перейти внутрь функции, вызываемой в текущей строке.
r - return выйти из текущей функции и остановиться.

b line - установить breakpoint в строке line.
b subname $varname =~ m/value/i - условный breakpoint на входе в функцию subname, при условии $varname=~...
b 45 $str =~ /file/ && $reg =~ /a/ - условный b по номеру строки

< print "index=["+$index+"]" - установить pre-promt, эта команда будет выполнятся перед тем как отладчик передает управление пользователю.
w $varname - наблюдать (watch) за переменной. Каждый раз, когда значение переменной меняется, останавливаться и печатать ее значение.
a 32 print "var1($var1), var2($var2)" - установка action'a. действие выполняется перед выполнением строки 32.
L b|a|w - показать список breakpoint'ов, action'ов, watch'ей.

B* - удалить все breakpoint'ы
A* - удалить все action
W* - удалить все watch
<* - удалить все pre-promt

doc perlre - вызов документации

Перезапуск, сохранения и т.д.
-n - перезапустить сессию отладки с начала и до текущей позиции или до предыдущей команды в истории выполненных команд.
sub subname{ print "123" if($_[0]);} - переопределение функции. если такая функция была в исходном файле, она будет замещена, но это не будет сохранено в исходниках
save current_db - сохранение истории команд в файле (простой файл - в каждой строке по команде)
R - запуск отладки с начала
sourse current_db - выполнение команд из файла

Если в процессе отладки код был изменен в отладчике и надо перенести изменения в исходники:
diff -u sourcefile.pl sourcefile.fixed >sourcefile.diff
patch sourcefile.pl sourcefile.diff

Трассировка
Опции:
maxTraceLen - максимальное количество строк, выводимых на одну выполненную строку кода.
frame - подробность выводимого сообщения:
0 - по-умолчанию. не показывать сообщения о входе/выходе из метода.
1 - показывать входы
2 - показывать выходы
4 - показывать значения аргументов и контекст (скалярный или массив)
8 - показывать ссылки
16 - показывать возвращаемые значения
если нужна смесь этих свойств, то суммировать: 1+2+4+8+16=31 - показывать все.

T - трассировать стек кода один раз (прямо сейчас)
t - вкл./выкл. трассировку по каждой строке

Установка трассировки в исходниках:
$DB::trace=1; #on
...#трассируемый код
$DB::trace=0; #off
Трассировка сама включится, если программа выполняется в отладчике.

Автоматическая трассировка в файл настраивается переменной окружения, например, в линухе:
export PERLDB_OPT="Line=trace.out autotrace=1 nonstop autotrace=1 frame=4"
в windows:
set PERLDB_OPT="Line=trace.out autotrace=1 nonstop autotrace=1 frame=4"
после выполнения perl -d filename
в файле trace.out будет результат трассировки. Если в исходниках встретится $DB::trace=0, то трассировка остановится.

Еще есть Devel::Trace, см. cpan.perl.org.

Отладка модулей
b compile subname - уст. b на первую строку, исполняемую после компиляции этой функции, например, перед выполнением блока BEGIN. Тут может быть два варианта:
1. модуль подгружается в процессе выполнения программы, тогда после запуска отладчика надо написать:
b compile Module::anysub
c
тогда остановимся в перед началом выполнения Module::BEGIN, если он есть
2. модуль подключается через use Module; в начале файла, тогда в момент установки breakpoint'a функция уже скомпилирована, и на надо перезапустить отладчик
b compile Module::anysub
R
тогда после перезапуска отладчик остановится, где требуется.
b postpone subname [condition] - установка b в начало функции, установка происходит в момент компиляции.
b load filename - уст. b на первую исполняемую строку, установка происходит после компиляции.
V package - посмотреть переменные другого пакета

Отладка ОО
f имя_файла - посмотреть текст
m имя_объекта - показывать список методов
l имя_объекта::имя_метода - посмотреть текст метода
x $o=Obj->new - дамп новового метода
i $o - показать дерево наследования
V Obj - список переменных пакета, можно использовать шаблон (не чувствительный к регистру):
V Obj ~(i:Ver)
y - список всех внутренних переменных (Особенности: 1. должен быть установлен PadWalker, 2. надо находится внутри функции, например:
c Obj::new
y)
t print $o->method() - трассировка метода
x $o->can(method) - если есть такой метод, то вернет ссылку на код
l $o::method

Похожие записи

Вы можете оставить
комментарий



    
© 2002-2016 Креограф. Все права защищены законом РФ
 Русский /  English