Tengo un proceso Perl en ejecución que está atascado, me gustaría meterlo adentro con un depurador para ver qué pasa. No puedo reiniciar el proceso. ¿Puedo adjuntar el depurador al proceso en ejecución? Sé que puedo hacer gdb -p
, pero gdb
no me ayuda. He intentado Enbugger, pero no pudo:¿Cómo puedo adjuntar un depurador a un proceso Perl en ejecución?
$ 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)
lo estoy haciendo mal? ¿Hay otras opciones?
P.S. Si usted piensa que podría beneficiarse de un depurador asociado a un proceso en ejecución a sí mismo, puede insertar una puerta trasera depurador provocada por SIGUSR1:
use Enbugger::OnError 'USR1';
, entonces puede simplemente kill -USR1 pid
y su proceso de saltará en el depurador.