Также возможно быстро получить трассировку управляемого стека с помощью GDB. Выполнить gdb
; используйте sudo, если вы не root или не отлаживаете процесс, принадлежащий вашему пользователю.
Выполните этот скрипт, который я получил со страницы отладка 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. Если вы запускаете процесс с помощью upstart, вы можете просто отредактировать задание upstart, используя console log
, чтобы зарегистрировать его в /var/log/upstart
.
Однако вас может заинтересовать другая тема, отличная от вашей основной темы. Для этого выполните info threads
, чтобы получить список потоков, и thread 2
, чтобы переключиться на поток № 2. Для получения дополнительной информации об отладке потоков см. программы отладки с несколькими потоками в документации GDB.
Как только вы закончите, выполните quit
, и ваша программа продолжит работу.