Каковы шаги и методы отладки очевидного зависания из-за тупиковой ситуации в производственном процессе Win32? Я слышал, что для этой цели можно использовать WinDbg, но не могли бы вы дать четкие подсказки, как это можно сделать?
Диагностика взаимоблокировок в программе Win32
Ответы (6)
Этот post должен помочь вам начать работу с различными вариантами .. Проверьте сообщения с тегом Debugging ..
Еще одна полезная статья о тупиках отладки ..
Отладка истинного тупика на самом деле довольно проста, если у вас есть доступ к источнику и дампу памяти (или сеансу отладки в реальном времени).
Все, что вам нужно сделать, это посмотреть на потоки и найти те, которые ожидают какого-то общего ресурса (например, зависшего в ожидании в WaitForSingleObject
). Вообще говоря, оттуда нужно выяснить, какие два или более потока заблокировали друг друга, а затем вам просто нужно выяснить, какой из них нарушил иерархию блокировок.
Если вы не можете легко определить, какие потоки заблокированы, используйте метод, показанный в этом разместите здесь, чтобы отследить цепочку блокировок для каждого потока. Когда вы попадаете в цикл, потоки в нем оказываются заблокированными.
Если вы очень ленивы, вы можете установить Application Verifier, затем добавить свой модуль и выбрать только «блокировки» из базового теста. тогда вы можете запускать свое приложение в любом отладчике.
если возникает тупик в критическом разделе, вы сразу же находите причину.
Какой язык / IDE вы используете?
В .Net вы можете просматривать потоки приложения: Debug-> Windows-> Threads или Ctrl + Alt + H
Отладка тупиковых ситуаций может быть сложной задачей. Я обычно веду какой-то лог и смотрю, где он заканчивается. Я либо регистрируюсь в файле, либо в консоли отладки с помощью OutputDebugString ().
Лучше всего начать с добавления операторов регистрации. Как правило, я бы рекомендовал только общие ресурсы, которые находятся в тупике, но также их добавление в целом может указывать на ситуации или области кода, которых вы не ожидали. Широко разрекламированная проблема с базой данных stackoverflow.com на самом деле оказалась log4net! Команда stackoverflow никогда не подозревала, что log4net, и только изучив ведение журнала (по иронии судьбы), показала это. Я бы изначально отказался от каких-либо сложных инструментов, например WinDgb, поскольку их использование не очень интуитивно понятно ИМХО.