33 votes

Comment puis-je attacher un débogueur à un processus Perl en cours d'exécution?

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.

11voto

rurban Points 904

Tout d'abord, merci d'utiliser le DÉBOGAGE de perl, si vous voulez inspecter avec gdb.

Veuillez définir "coincé". Occupé ou non occupé attente (basse ou haute CPU), de manger de la mémoire ou pas? Avec, tout en 1, il est occupé attente. Je reçois habituellement occupé attente (interminable cycles) sur l'HV de corruption dans Perl_hfree_next_entry() depuis 5.15. Non-occupé d'attente est habituellement d'attente sur un blocage IO lire.

Je reçois le bon:

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

et peut inspecter tout, beaucoup plus qu'un simple débogueur perl. Avec un non filetée de perl, vous devez taper moins.

`(gdb) p Perl_op_dump(PL_op)`

et ainsi de suite.

Si vous avez à faire avec perl: à l'Intérieur de la pp_stub fonction, il n'est pas une bonne idée d'entrer dans le Enbugger runloop, vous devriez être dans la principale runloop dans le dump.c. Définissez un point d'arrêt à la ligne.

"erreur pour objet 0x3" sur eval sonnent comme de la corruption interne dans le contexte, et donc vous devriez regarder la cx et la pile de pointeurs. Probablement parce que vous avez commencé dans un mauvais contexte.

6voto

aparker Points 138

Je n'ai jamais utilisé gdb, mais peut-être pourriez-vous retirer quelque chose d'utile?

 strace -f -s512 -p <PID>
 

6voto

datasunny Points 99

http://metacpan.org/pod/App::Stacktrace "perl-stacktrace imprime les traces de pile Perl des threads Perl pour un processus Perl donné. Pour chaque trame Perl, le nom de fichier complet et le numéro de ligne sont imprimés."

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X