Вам нужна комбинация мини-дампов (используйте DrWatson для их создания, если вы не хотите добавлять собственный код генерации мини-дампов) и userdump для запуска создания мини-дампов при зависании.
Особенность автоматического обнаружения зависания заключается в том, что трудно определить, когда что-то зависает, а когда оно просто замедляется или блокируется IO-ожиданием. Лично я предпочитаю, чтобы пользователь сознательно завершал работу приложения, когда он думал, что оно зависло. Помимо того, что это намного проще (мои приложения не склонны часто зависать, если вообще :)), это также помогает им «быть частью решения». Им это нравится.
Во-первых, ознакомьтесь с классической статьей , посвященной ошибкам , касающейся аварийных дампов и символов, в которой также содержится отличная информация о том, что происходит с этими вещами.
Во-вторых, получите userdump , который позволяет вам создавать дампы, и инструкции для его настройки для создания дампов
Когда у вас есть дамп, откройте его в WinDBG, и вы сможете проверить все состояние программы - включая потоки и стеки вызовов, регистры, память и параметры функций. Я думаю, что вам будет особенно интересно использовать команду « ~ * kp » в Windbg для получения стека вызовов каждого потока и команду «! Locks» для отображения всех объектов блокировки. Я думаю, вы обнаружите, что зависание будет происходить из-за тупиковой ситуации объектов синхронизации, которые будет трудно отследить, так как все потоки, как правило, ждут вызова WaitForSingleObject, но посмотрите вниз на стеки вызовов, чтобы увидеть потоки приложения (скорее чем «рамки», такие как фоновые уведомления и сетевые процедуры). После того, как вы сузили их, вы сможете увидеть, какие звонки были сделаны, возможно, добавив в приложение некоторые средства ведения журналов, чтобы попытаться предоставить вам дополнительную информацию, готовую к следующему провалу.
Удачи.
Ps. Быстрый гугл напомнил мне об этом: Отладка тупиков . (CDB - это эквивалент командной строки windbg)