2012-01-12 12 views
32

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.

Respuesta

6

Nunca he usado gdb, pero tal vez podría obtener algo útil de la estrategia?

strace -f -s512 -p <PID> 
11

En primer lugar, utilice un perl DEBUGGING, si desea inspeccionarlo con gdb.

Defina "pegado". Espera ocupada o no ocupada (CPU alta o baja), ¿come memoria o no? Con while 1 está ocupado esperando. Normalmente me ocupo de esperar (ciclos infinitos) sobre la corrupción de HV en Perl_hfree_next_entry() desde 5.15. La espera no ocupada generalmente está esperando en una lectura IO de bloqueo.

tengo la correcta:

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

y puede inspeccionar todo, mucho más que con un simple depurador Perl. Con un perl sin hilos, debe escribir menos.

`(gdb) p Perl_op_dump(PL_op)` 

y así sucesivamente.

Si tiene que ver con perl: Dentro de la función pp_stub no es una buena idea ingresar al runloop de Enbugger, debe estar en el runloop principal en dump.c. Establezca un punto de interrupción a la línea mostrada.

"error para el objeto 0x3" en el sonido eval como corrupción interna en el contexto, por lo que debe mirar los punteros cx y stack. Probablemente porque lo comenzaste en un mal contexto.

4

http://metacpan.org/pod/App::Stacktrace "perl-stacktrace imprime Perl pila de trazas de hilos Perl para un determinado proceso de Perl. Para cada cuadro de Perl, se imprimen el nombre completo del archivo y el número de línea. "

Cuestiones relacionadas