2010-01-14 3 views
15

Comment afficher les threads (stacktraces) dans une application suspendue exécutée avec MONO?Comment faire un vidage de fil avec MONO?

Je sais que je peux le faire en .NET avec le Managed Stack Explorer (MSE). Parce que l'application ne se bloque qu'avec MONO que je dois le faire avec MONO.

Ou il y a d'autres idées comment je peux trouver le lieu de la pendaison?

Répondre

16

En supposant que vous utilisez Linux/Unix, pas Windows, envoyez un signal SIGQUIT à votre programme. Cela peut être fait avec

kill -QUIT $PID 

où $ PID est le pid de votre programme. Mono va alors vider les traces de pile de tous les threads sur stdout. Notez que bien que le processus continue à fonctionner après cela, vous ne devriez pas vous attendre à ce qu'il reste utilisable/stable.

Voir http://en.wikipedia.org/wiki/SIGQUIT pour quelque arrière-plan.

0

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.

Questions connexes