Il est également possible de récupérer rapidement une trace de pile gérée à l'aide de GDB. Exécuter gdb
; Utilisez sudo si vous n'êtes pas root ou déboguez un processus appartenant à votre utilisateur.
Exécuter ce script que je suis arrivé de la page debugging Mono sur mono-project.org:
handle SIGXCPU SIG33 SIG35 SIGPWR nostop noprint
define mono_stack
set $mono_thread = mono_thread_current()
if ($mono_thread == 0x00)
printf "No mono thread associated with this thread\n"
else
set $ucp = malloc (sizeof (ucontext_t))
call (void) getcontext ($ucp)
call (void) mono_print_thread_dump ($ucp)
call (void) free ($ucp)
end
end
Si vous le souhaitez, vous pouvez déposer ces commandes dans votre ~/.gdbinit
afin que vous ne devez pas copier-coller tout le temps.
Maintenant joindre à votre PID:
attach 12345
Notez que le processus est maintenant en pause si vous faites cela dans la production, il est conseillé de ce script il est donc aussi vite que possible.
Pour obtenir votre trace de pile, exécutez mono_stack
comme défini ci-dessus. Notez que vous ne verrez pas la sortie dans gdb mais dans stdout. Si vous exécutez votre processus avec upstart, vous pouvez simplement modifier le travail de démarrage pour utiliser console log
pour le connecter à /var/log/upstart
.
Vous pourriez cependant être intéressé par un autre sujet que votre fil principal. Pour ce faire, exécutez info threads
pour obtenir votre liste de threads et thread 2
pour passer au thread # 2. Pour plus d'informations sur le débogage de thread, voir debugging programs with multiple threads dans les documents GDB.
Une fois que vous avez terminé, exécutez quit
et votre programme continuera à fonctionner.