Как мне найти lockholder (считыватель) моего ReaderWriterLock в windbg

StackOverflow https://stackoverflow.com/questions/316894

Вопрос

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

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

Спасибо

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

Это было полезно?

Решение 4

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

Другие советы

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

Если у вас есть взаимоблокировка блока синхронизации, расширение СОСЕКС возможно, это то, что вам нужно.Это расширение предлагает команду !dlk, которая показывает, какие потоки ожидают каких блокировок.Это работает только для блоков синхронизации, хотя взаимоблокировки на других объектах синхронизации не будут обнаружены, если вы используете lock() (Монитор.Введите) для вас это не должно быть проблемой.

Попробуй сосекс и !dlk

Некоторое время назад я опубликовал здесь аналогичную тему, Используя C #, можно ли проверить, удерживается ли блокировка файла

Я ссылался на ряд статей и тому подобное, но wait chain traversial (WCT) может вам помочь, это несколько щекотливо, но этот msdn mag истребитель ошибок статья показывает, как использовать WCT в windbg в управляемом контексте.

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

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

с

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top