Как я могу прикрепить отладчик к работающему процессу Perl?

У меня есть работающий процесс 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) 

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


P.S. Если вы думаете, что вы могли бы извлечь выгоду из отладчика, подключенного к запущенному процессу, вы можете вставить черный ход отладчика, запускаемый SIGUSR1:

use Enbugger::OnError 'USR1';

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

33
задан zoul 12 January 2012 в 15:54
поделиться