В Windows родные приложения Windbg - инструмент для меня. Если возможно, я буду отлаживать в реальном времени заблокированный процесс, в случае неудачи из-за полного дампа памяти процесса.
Мой подход - нарисовать график ожидания , документирующий отношения между потоками и ресурсами. Обычно я запускаю команду ! Locks , чтобы определить, какие потоки содержат какие-либо критические разделы в заблокированном процессе.
Затем я начинаю рисовать график ожидания, выбирая критическую секцию с наибольшим числом конфликтов (если есть тупик, на графике будет цикл, поэтому не имеет значения, с чего начать). Найдите поток-владелец и выберите его в отладчике (команда ~ позволяет связать идентификаторы потоков с номерами потоков, используемыми отладчиком, используйте ~ *** номер потока *** s для выбора потока и kbn для отображения его стека. Если процесс заблокирован, скорее всего, он будет выполнять какую-либо операцию блокировки, например, искать вызовы RtlEnterCriticalSection или WaitForSingleObject и др. В ситуации тупика эти вызовы обычно позволяют вам определить другой ресурс, которого ожидают. Добавьте эту информацию в график ожидания и продолжайте, пока вы не вернетесь к тому, с чего начали.
Если ваш график ожидания пересекает границы процесса, вы можете обнаружить, что вам нужно найти, кто владеет объектом ядра в другом процессе (вот почему я отлаживаю вживую, если могу). Для этой цели полезен инструмент sysinternals Process Explorer.
После того, как вы определили участников в тупик, вам нужно надеть мышление, чтобы понять, куда идти дальше. Это может означать изменение порядка получения ресурсов (как кто-то указал), но на самом деле нет общего метода, ему потребуется дополнительная информация о дизайне приложения, чтобы понять, как удалить циклическую зависимость в графике ожидания.
Существуют обстоятельства, когда цикл не может быть причиной проблемы, например, ваша система может ожидать ввода пользователя, который никогда не придет (передает любого, кто видел вызов MessageBox для процесса, выполняющегося как служба).
Конечно, есть нечто большее, чем это, но я надеюсь, что это может направить вас в правильном направлении.