Диагностика взаимоблокировок в программе Win32

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


person Jorge Ferreira    schedule 18.09.2008    source источник


Ответы (6)


Этот post должен помочь вам начать работу с различными вариантами .. Проверьте сообщения с тегом Debugging ..

Еще одна полезная статья о тупиках отладки ..

person Gulzar Nazim    schedule 18.09.2008

Отладка истинного тупика на самом деле довольно проста, если у вас есть доступ к источнику и дампу памяти (или сеансу отладки в реальном времени).

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

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

person 1800 INFORMATION    schedule 18.09.2008

Если вы очень ленивы, вы можете установить Application Verifier, затем добавить свой модуль и выбрать только «блокировки» из базового теста. тогда вы можете запускать свое приложение в любом отладчике.
если возникает тупик в критическом разделе, вы сразу же находите причину.

person Tal    schedule 24.09.2008

Какой язык / IDE вы используете?

В .Net вы можете просматривать потоки приложения: Debug-> Windows-> Threads или Ctrl + Alt + H

person Nescio    schedule 18.09.2008

Отладка тупиковых ситуаций может быть сложной задачей. Я обычно веду какой-то лог и смотрю, где он заканчивается. Я либо регистрируюсь в файле, либо в консоли отладки с помощью OutputDebugString ().

person Adam Pierce    schedule 18.09.2008

Лучше всего начать с добавления операторов регистрации. Как правило, я бы рекомендовал только общие ресурсы, которые находятся в тупике, но также их добавление в целом может указывать на ситуации или области кода, которых вы не ожидали. Широко разрекламированная проблема с базой данных stackoverflow.com на самом деле оказалась log4net! Команда stackoverflow никогда не подозревала, что log4net, и только изучив ведение журнала (по иронии судьбы), показала это. Я бы изначально отказался от каких-либо сложных инструментов, например WinDgb, поскольку их использование не очень интуитивно понятно ИМХО.

person Dan    schedule 18.09.2008