2010-01-14 12 views
15

Come posso visualizzare i thread (stacktraces) in un'applicazione sospesa che funziona con MONO?Come si esegue un dump di thread con MONO?

So che posso farlo in .NET con Managed Stack Explorer (MSE). Perché l'applicazione si blocca solo con MONO che ho bisogno di farlo con MONO.

Oppure ci sono altre idee su come posso trovare il luogo dove appendere?

risposta

16

Supponendo che tu sia su Linux/Unix, non su Windows, invia un segnale SIGQUIT al tuo programma. Questo può essere fatto con

kill -QUIT $PID 

dove $ PID è il pid del programma. Mono eseguirà quindi il dump dello stack di tutti i thread sullo stdout. Nota che anche se il processo continua a funzionare dopo questo, non dovresti aspettarti che rimanga utilizzabile/stabile.

Vedere http://en.wikipedia.org/wiki/SIGQUIT per alcuni sfondi.

0

È anche possibile acquisire rapidamente una traccia di stack gestita tramite GDB. Esegui gdb; usa sudo se non sei root o esegui il debug di un processo di proprietà dell'utente.

eseguire questo script che ho ottenuto dalla pagina debugging Mono su 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 

Se ti piace si può cadere questi comandi nel vostro ~/.gdbinit in modo da non dover copiare e incollare tutto il tempo.

Ora allegare al PID:

attach 12345 

Si noti che l'intero processo è ora in pausa, quindi se si sta facendo questo nella produzione si consiglia di questo script in modo che sia il più velocemente possibile.

Per ottenere la traccia dello stack, eseguire mono_stack come definito sopra. Nota che non vedrai l'output in gdb ma in stdout. Se si esegue il processo con upstart, è possibile modificare il lavoro upstart per utilizzare console log per collegarlo a /var/log/upstart.

Potrebbe interessarti un altro thread rispetto al thread principale. Per fare ciò, eseguire info threads per ottenere l'elenco di thread e thread 2 per passare al thread # 2. Per ulteriori informazioni sul debug dei thread, vedere debugging programs with multiple threads nei documenti GDB.

Una volta terminato, eseguire quit e il programma continuerà a funzionare.