Как сделать дамп потока с помощью MONO? - PullRequest
19 голосов
/ 14 января 2010

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

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

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

Ответы [ 2 ]

22 голосов
/ 15 января 2010

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

kill -QUIT $PID

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

См. http://en.wikipedia.org/wiki/SIGQUIT для некоторого фона.

Примечание. Дамп потока не будет распечатан в окне терминала, в котором вы выполнили команду kill. Он появится в stderr моно процесса.

1 голос
/ 31 августа 2016

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

...