Общая стратегия поиска причины случайных зависаний? - PullRequest
4 голосов
/ 28 ноября 2009

У меня есть приложение, которое случайно зависает, включая IDE, и это сводит меня с ума. Это заставляет меня задуматься:

Какая общая стратегия для нахождения причины случайных зависаний?

Ответы [ 5 ]

5 голосов
/ 28 ноября 2009

Если вы хотите проверить извне работающего приложения, я бы потенциально использовал набор инструментов sysinternals.com от Mark Russonivich, инструмент perfmon, позволяющий отслеживать доступ к файлу / реестру и проверять трассу на наличие задержек - и что это такое доступ в то время. Он покажет, что стек вызовов DLL в то время с правильными символами может быть полезен для отладки проблем, внешних по отношению к приложению, которые вызывают задержки. (Я использовал его, чтобы выяснить, что фильтр ввода-вывода, связанный с пакетом безопасности, был причиной того, что приложение обнаруживало некоторое количество задержек в 1,5 с.)

4 голосов
/ 28 ноября 2009

Если вам повезет, вы можете запустить свой код в отладчике, пока он не замерзнет, ​​а затем остановите его, чтобы найти строку кода, которая нарушает работу. Но если бы это было так просто, вы бы, наверное, не просили совета. : -)

Две стратегии, которые можно использовать вместе, это «разделяй и властвуй» и «оставляйте хлебные крошки».

Разделяй и властвуй: Закомментируй все более крупные части своего кода. Если он по-прежнему зависает, вы сократили объем кода, который может быть ответственен за его остановку. Предупреждение: в конечном итоге вы закомментируете некоторый код, и программа не остановится. Это не означает, что последний бит кода обязательно отвечает за остановку; просто как-то вовлечено . Положи его обратно и закомментируй что-нибудь еще.

Оставить хлебные крошки: Заставьте вашу программу сообщать вам, где она находится и что она делает во время выполнения. Отобразите сообщение, добавьте в файл журнала, сделайте звук или отправьте пакет по сети. Является ли путь выполнения, как вы ожидали? Каково было последнее, что он делал, прежде чем замерз? Опять же, имейте в виду, что последнее сообщение, возможно, пришло из другого потока, чем тот, который отвечает за зависание программы, но по мере приближения к причине вы будете настраивать, что и где регистрирует код.

2 голосов
/ 28 ноября 2009

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

1 голос
/ 28 ноября 2009

Я бы установил инструмент UserDump и следовал бы этим инструкциям для создания дампа пользователя приложения ....

Получив пользовательский дамп, вы можете использовать WinDbg или cdb для проверки потоков, стеков, блокировок и т. Д.

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

0 голосов
/ 03 декабря 2009

Хорошая общая стратегия - запускать программу, пока она не зависнет. Затем подключите к нему отладчик и посмотрите, что происходит. В программе с графическим интерфейсом вас больше всего интересует, что делает поток пользовательского интерфейса.

Вы говорите, что приложение зависает в IDE. Этого не должно быть, и я предполагаю, что это означает, что программа так сильно нагружает ОС (возможно, загрузку процессора или памяти), что вся система испытывает трудности.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...