Добраться до нужного стека за исключением - PullRequest
4 голосов
/ 29 июля 2011

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

Итак, я смотрю на дампфайлы, чей сбойный стекуказывая на сторожевой поток.Мне нужно идентифицировать реальную неисправную нить.

Я ищу общие советы и возможную стратегию использования windbg для определения реальной неисправной нити.

Ответы [ 3 ]

0 голосов
/ 29 июля 2011

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

0 голосов
/ 02 августа 2011

Сторожевой таймер должен знать, какой поток не ответил вовремя, поскольку он проверяет. Вы упоминаете, что есть событие для каждого потока ... возможно, в стеке сторожевого потока все еще есть некоторая информация, которая может помочь вам определить, какой поток не отвечает?

Если нет, просто сбросьте все следы стека с помощью команды ~ * kc и посмотрите, сможете ли вы найти что-нибудь подозрительное.

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

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

0 голосов
/ 29 июля 2011

Верификатор приложений - хороший инструмент. http://msdn.microsoft.com/en-us/library/ms220948%28v=vs.90%29.aspx

Верификатор приложений замедляет код и предоставляет множество команд для анализа проблем.

в общем, чтобы найти проблемы в режиме релиза,

  1. сгенерируйте pdb для сборки выпуска
  2. Если ваш релиз запускается на вашем ПК для разработки, откройте Visual Studio и присоедините процесс (более простой способ)

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

...