Как я могу прикрепить отладчик к работающему процессу Perl? - PullRequest
33 голосов
/ 12 января 2012

У меня запущенный Perl-процесс, который застрял, и я хотел бы заглянуть внутрь с помощью отладчика, чтобы увидеть, что не так.Я не могу перезапустить процесс.Можно ли подключить отладчик к запущенному процессу?Я знаю, что могу сделать gdb -p, но gdb мне не помогает.Я пробовал Enbugger , но не смог:

$ perl -e 'while (1) {}'&
[1] 86836
$ gdb -p 86836
…
Attaching to process 86836.
Reading symbols for shared libraries . done
Reading symbols for shared libraries ............................. done
Reading symbols for shared libraries + done
0x000000010c1694c6 in Perl_pp_stub ()
(gdb) call (void*)Perl_eval_pv("require Enbugger;Enbugger->stop;",0)
perl(86836) malloc: *** error for object 0x3: pointer being realloc'd was not allocated
*** set a breakpoint in malloc_error_break to debug

Program received signal SIGABRT, Aborted.
0x00007fff8269d82a in __kill ()
The program being debugged was signaled while in a function called from GDB.
GDB remains in the frame where the signal was received.
To change this behavior use "set unwindonsignal on"
Evaluation of the expression containing the function (Perl_eval_pv) will be abandoned.
(gdb) 

Я делаю это неправильно?Существуют ли другие варианты?


PS Если вы считаете, что можете воспользоваться отладчиком, подключенным к запущенному процессу самостоятельно, вы можете вставить заднюю дверь отладчика, запущенную SIGUSR1:

use Enbugger::OnError 'USR1';

Тогда вы можете просто kill -USR1 pid и ваш процесс перейдет в отладчик.

Ответы [ 3 ]

11 голосов
/ 17 января 2012

Во-первых, пожалуйста, используйте perl отладки, если вы хотите проверить его с помощью gdb.

Пожалуйста, укажите "застрял". Ожидание занято или занято (высокая или низкая загрузка процессора), есть память или нет? Пока 1 занято ожиданием. Я обычно жду (бесконечные циклы) на повреждение HV в Perl_hfree_next_entry () с 5.15. Ожидание незанятости обычно ожидает блокирующего чтения ввода-вывода.

Я понял правильно:

`0x00007fba15ab35c1 in Perl_runops_debug () at dump.c:2266`
`2266       } while ((PL_op = PL_op->op_ppaddr(aTHX)));`

и может проверять все, гораздо больше, чем с помощью простого отладчика perl. При использовании Perl без нити вы должны печатать меньше.

`(gdb) p Perl_op_dump(PL_op)`

и т. Д.

Если вы имеете дело с perl: внутри функции pp_stub вводить цикл запуска Enbugger не рекомендуется, вы должны находиться в главном цикле выполнения в файле dump.c. Установите точку останова для показанной линии.

"ошибка для объекта 0x3" на eval звучит как внутреннее повреждение в контексте, поэтому вы должны взглянуть на указатели cx и stack. Возможно, потому что вы начали это в плохом контексте.

6 голосов
/ 31 мая 2014

http://metacpan.org/pod/App::Stacktrace «Perl-stacktrace печатает трассировки стека Perl потоков Perl для данного процесса Perl. Для каждого фрейма Perl печатаются полное имя файла и номер строки. ”

6 голосов
/ 13 января 2012

Я никогда не использовал GDB, но, может быть, вы могли бы получить что-то полезное из Strace?

strace -f -s512 -p <PID>
...