Также можно быстро захватить трассировку управляемого стека с помощью GDB. Выполнить gdb
; используйте sudo, если вы не root или не отлаживаете процесс, принадлежащий вашему пользователю.
Выполнить этот скрипт, который я получил от debugging Mono страницы на 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
Если вы хотите, вы можете оставить эти команды в ~/.gdbinit
так что вам не нужно копировать и вставлять все время.
Теперь прикрепить к PID:
attach 12345
Обратите внимание, что весь процесс сейчас приостановлен, так что если вы делаете это в производстве, желательно, чтобы скрипт это так, что это так быстро, как это возможно.
Чтобы получить трассировку стека, выполните mono_stack
, как определено выше. Обратите внимание, что вы не увидите вывод в gdb, а в stdout. Если вы запускаете свой процесс с помощью выскочки, вы можете просто отредактировать задание выскочки, чтобы использовать console log
, чтобы зарегистрировать его до /var/log/upstart
.
Возможно, вас заинтересует другая тема, кроме основной темы. Для этого выполните info threads
, чтобы получить список тем и thread 2
, чтобы переключиться на тему # 2. Дополнительные сведения об отладке потоков см. В разделе debugging programs with multiple threads в документах GDB.
Как только вы закончите, выполните quit
, и ваша программа продолжит работу.