2010-01-14 9 views
15

¿Cómo puedo mostrar los hilos (stacktraces) en una aplicación colgante que se ejecuta con MONO?¿Cómo realizo un volcado de hilo con MONO?

Sé que puedo hacerlo en .NET con Managed Stack Explorer (MSE). Debido a que la aplicación se cuelga solo con MONO, necesito hacerlo con MONO.

¿O hay alguna otra idea de cómo puedo encontrar el lugar de colgar?

Respuesta

16

Suponiendo que está en Linux/Unix, no en Windows, envíe una señal SIGQUIT a su programa. Esto se puede hacer con

kill -QUIT $PID 

donde $ PID es el pid de su programa. Mono luego volcará los rastros de pila de todos los hilos a stdout. Tenga en cuenta que, aunque el proceso siga ejecutándose después de esto, no debe esperar que siga siendo utilizable/estable.

Vea http://en.wikipedia.org/wiki/SIGQUIT para obtener más información.

0

También es posible tomar rápidamente una traza de pila administrada usando GDB. Ejecute gdb; utilice sudo si no es root o depurando un proceso propiedad de su usuario.

Ejecutar este script que obtuve de la página debugging Mono en 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 lo desea, puede colocar estos comandos en su ~/.gdbinit por lo que no tiene que copiar y pegar todos el tiempo.

Ahora adjuntar a su PID:

attach 12345 

Tenga en cuenta que todo el proceso está en pausa por lo que si usted está haciendo esto en la producción, es aconsejable escritura de este por lo que es tan rápido como sea posible.

Para obtener su seguimiento de pila, ejecute mono_stack como se define arriba. Tenga en cuenta que no verá la salida en gdb sino en stdout. Si ejecuta su proceso con advenedizo puede simplemente editar el trabajo advenedizo para usar console log para registrarlo en /var/log/upstart.

Sin embargo, le puede interesar otro hilo que el hilo principal. Para hacerlo, ejecute info threads para obtener su lista de hilos y thread 2 para cambiar al hilo # 2. Para obtener más información sobre la depuración de subprocesos, consulte debugging programs with multiple threads en los documentos de GDB.

Una vez que haya terminado, ejecute quit, y su programa continuará funcionando.

Cuestiones relacionadas