2010-01-14 8 views
15

Как я могу показать потоки (stacktraces) в висячем приложении, которое работает с MONO?Как создать дамп потока с помощью MONO?

Я знаю, что могу это сделать в .NET с помощью Managed Stack Explorer (MSE). Поскольку приложение зависает только с MONO, мне нужно сделать это с помощью MONO.

Или есть другие идеи, как я могу найти место для подвешивания?

ответ

16

Предполагая, что вы используете Linux/Unix, а не Windows, отправьте сигнал SIGQUIT в свою программу. Это можно сделать с помощью

kill -QUIT $PID 

где $ PID - это pid вашей программы. Затем Mono сбрасывает трассировки стека всех потоков в стандартный вывод. Обратите внимание, что, хотя процесс продолжает работать после этого, вы не должны ожидать, что он останется работоспособным/стабильным.

См. http://en.wikipedia.org/wiki/SIGQUIT для фона.

0

Также можно быстро захватить трассировку управляемого стека с помощью 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, и ваша программа продолжит работу.