Диагностика тупиков в программе Win32 - PullRequest
5 голосов
/ 18 сентября 2008

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

Ответы [ 6 ]

8 голосов
/ 18 сентября 2008

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

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

4 голосов
/ 18 сентября 2008

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

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

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

1 голос
/ 24 сентября 2008

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

0 голосов
/ 18 сентября 2008

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

0 голосов
/ 18 сентября 2008

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

0 голосов
/ 18 сентября 2008

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

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

...