.net mono stack-trace thread-dump

.net - ¿Cómo hago un volcado de hilo con MONO?



stack-trace thread-dump (2)

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 tu programa. Mono luego volcará los rastros de pila de todos los hilos a la salida estándar. Tenga en cuenta que aunque el proceso sigue ejecutándose después de esto, no debe esperar que siga siendo utilizable / estable.

Ver http://en.wikipedia.org/wiki/SIGQUIT para algunos antecedentes.

Nota: el volcado de hilos no se imprimirá en la ventana de la terminal donde ejecutó el comando kill . Aparecerá en el stderr del proceso mono.

¿Cómo puedo mostrar los hilos (stacktraces) en una aplicación que se ejecuta con MONO?

Sé que puedo hacerlo en .NET con el Managed Stack Explorer (MSE). Porque la aplicación solo cuelga con MONO que necesito hacer con MONO.

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


También es posible capturar rápidamente un seguimiento de pila gestionado utilizando GDB. Ejecuta gdb ; use sudo si no es root o está depurando un proceso que es propiedad de su usuario.

Ejecute este script que obtuve de la página de depuración de 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 para que no tenga que copiar y pegar todo el tiempo.

Ahora adjuntar a su PID:

attach 12345

Tenga en cuenta que ahora todo el proceso está en pausa, por lo que si está haciendo esto en producción, es aconsejable realizar una secuencia de comandos para que sea lo más rápido posible.

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

Sin embargo, puede estar interesado en otro hilo que no sea su hilo principal. Para hacerlo, ejecute info threads para obtener su lista de thread 2 y el thread 2 para cambiar al hilo # 2. Para obtener más información sobre la depuración de subprocesos, vea programas de depuración con varios subprocesos en los documentos de GDB.

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