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.