È 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.
fonte
2016-08-31 12:31:22