J'ai l'exécution d'un processus Perl qui est coincé, je tiens à le pousser à l'intérieur avec un débogueur pour voir quel est le problème. Je ne peux pas redémarrer le processus. Puis-je attacher le débogueur au processus en cours d'exécution? Je sais que je peux faire gdb -p
, mais gdb
ne m'aide pas. J'ai essayé Enbugger, mais a échoué:
$ 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)
Suis-je le fais mal? Existe-il d'autres options?
P. S. Si vous pensez que vous pourriez bénéficier d'un débogueur à un processus en cours d'exécution, vous pouvez insérer un débogueur porte arrière déclenchée par le signal SIGUSR1:
use Enbugger::OnError 'USR1';
Ensuite, vous pouvez simplement kill -USR1 pid
et votre processus de sauter dans le débogueur.