2008-11-25 2 views
2

У меня есть дамп процесса. Net, который зависает из-за тупика (поток gui больше не отвечает, а мои журналы показывают, что некоторые потоки перестали отвечать). Я сделал снимок, и теперь я просматриваю его в windbg, и все нитки в очереди ждут последнего. Глядя на стеке с одним потоком с помощью! Clrstack -p, я вижу, что он пытается получить запись на ReaderWriterLockКак найти фиксатор (считыватель) моего ReaderWriterLock в windbg

Как узнать, какая другая нить содержит эту блокировку, чтобы я мог начать выяснять, как произошел тупик?

благодаря

[править], по-видимому была команда! Rwlocks в SOS.dll .Net1.1, чтобы помочь с этим, но это не есть в версии .Net2.0. Охота продолжается

ответ

0

Пока что лучший подход - посмотреть на! Dso для всех стеков потоков и посмотреть, какие из них ссылаются на блокировку. Быстрая проверка после этого позволяет нам отслеживать, какие потоки занимают блокировки. На самом деле не очень или быстрый способ, хотя ...

1

Я не совсем уверен, но вы, возможно, сможете использовать SyncBlk для просмотра объектов блока синхронизации, если вы вызываете его без каких-либо аргументов, я думаю, вы должны увидеть блоки синхронизации, которые принадлежат нить.

Если у вас есть блокировка блокировки синхронизации, расширение SOSEX может быть тем, что вам нужно. Это расширение предлагает команду! Dlk, которая показывает, какие потоки ждут, какие блокировки. Это работает только для блоков синхронизации, хотя взаимоблокировки на других объектах синхронизации не будут обнаружены, если вы используете lock() (Monitor.Enter), это не должно быть проблемой для вас.

+0

Мы используем встроенные ReaderWriterLocks, которые не отображаются на! Dlk – Oskar 2008-11-26 07:15:26

0

Подход, который обеспечит прослеживаемость, чтобы обернуть ваши замки в IDisposable интерфейс и заменить:

замок (mylock) {...}

с

использованием (новый DisposeableLock()) {...}

Вы можете войти в конструктор и Dispose() методы либо на консоль, или log4net, или какой-либо другой механизм. Это позволит вам увидеть, что блокируется и что блокирует на что.

+0

. У нас очень много замков в нашем приложении, поэтому две строки ведения журнала для каждого потока будут очень быстро складываться. Проблема также, кажется, происходит только в течение двух недель у десяти пользователей и никогда не происходила в среде разработки, поэтому это довольно дорогостоящий подход. Но если ничего не работает ... – Oskar 2008-11-27 08:44:53

+0

Блокировка IDisposable, вероятно, ухудшит производительность, поскольку каждый «DisposableLock» должен будет пройти раунд финализации GC, за которым следует фактический цикл сбора GC = иногда приводящий к отсутствию доступа, из-за выделения памяти быстрее, чем она достигает очереди GC. – 2008-12-09 03:06:47

1

Попробуйте sosex и! DLK

+0

! Dlk работает только если у вас есть блоки синхронизации (например, lock (myObject.SyncRoot) {} или Мониторы), а не с ReaderWriterLocks – Oskar 2008-12-15 09:29:11

1

Я отправил Двойники тему некоторое время назад здесь, Using C# is it possible to test if a lock is held on a file

я сослался на ряд статей и такие, но ждать цепи traversial (ДАП) может помочь вам, это несколько но это msdn mag bugslayer article show, как использовать WCT в windbg в управляемом контексте.

Смежные вопросы