2010-11-30 4 views
1

У меня есть многопоточный код, который зависает в некотором случае. Я хочу знать, что является рекомендуемым способом отладки?как отлаживать код, который висит

+3

Если вы не дадите нам представление о том, что вы делаете, мы не сможем помочь вам – 2010-11-30 01:09:31

+0

поистине качественный вопросник, но это название, которое я люблю больше всего: D – 2010-11-30 01:14:22

ответ

1

Когда он зависает, вы можете прикрепить отладчик и проверить состояние резьбы, включая стоп-сигналы, на содержание вашего сердца. Часто будет один (или более) поток (-ы), который (есть) в состоянии ожидания, и вы, возможно, сможете решить, почему это так.

Если государство не является самоочевидным во время зависания, вы можете прибегнуть к методам, предлагаемым для предоставления контекстной информации для предыдущего потока программы.

0

Поскольку он многопоточен, вы не можете отлаживать такие параметры, как установка контрольных точек, отслеживание операторов и пауза, чтобы увидеть значения переменных. Единственным способом, на мой взгляд, является печать на консоль и просмотр статуса оттуда.

1

Он достаточно часто висит (т. Е. Вам не нужно ждать часы/дни для зависания)? Если он редко висит - захватите полный дамп (т. Е. С помощью диспетчера задач), чтобы позже отлаживать его с помощью WinDbg. Если он достаточно велик - Visual Studio намного проще в использовании - просто прикрепите (Debug -> Attach to process) к зависанию процесса, как было предложено ранее (если вы не используете версии Express - «attach» не является его частью)

Самый полезный вид в VS будет Debug -> Window -> Threads in one window и Debug -> Call Stack в другом. Пройдите через все потоки и посмотрите, есть ли очереди, ожидающие некоторых общих объектов.

Существует много информации о том, как отлаживать зависания с помощью WinDbg - поиск «windbg sos hang», чтобы найти детали. То есть http://blogs.msdn.com/b/tess/archive/2009/10/19/net-hang-case-study-the-danger-of-locking-on-strings.aspx

Заканчивать блог Rico Mariani в - http://blogs.msdn.com/b/ricom/archive/2010/06/04/debugging-multi-threaded-applications-some-tidbits.aspx

На трассировку: Это чрезвычайно полезно, но будьте осторожны, чтобы не вводить более блокирующие проблемы с кодом трассировки. То есть Концевые выходные вызовы медленны и сериализованы, поэтому ваш зависание может исчезнуть.