2012-04-05 2 views
8

Если приложение VB6 вызывает событие Application Hang, которое должно появиться в средстве просмотра событий, как узнать, почему приложение висит?Как узнать больше о приложении Hang event?

Действительно ли событие Application Hang означает, что приложение замерзло и разбилось, или просто оно временно зависает?

Все я получаю в журнале событий для этого события:

Hanging application [MyAppName].exe, version [MyAppVersionNo], hang module hungapp, version 0.0.0.0, hang address 0x00000000. 

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

+0

Имеет ли ваше приложение длинные подпрограммы, когда он занят и не может отвечать на сообщения Windows? – jac

+0

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

+0

Вы можете сделать дамп памяти процесса (или позволить пользователю сделать это), когда приложение зависает, а затем анализирует его и просматривает стек вызовов. – MicSim

ответ

5

Я рекомендую использовать набор инструментов Windows Performance Toolkit.Лучшая версия для использования - в Windows Assessment & Deployment Kit, http://www.microsoft.com/download/en/details.aspx?id=28997

После того, как он установлен, вы запустите Windows Performance Recorder (WPR) и нажмите кнопку «Пуск», чтобы начать запись. Затем воспроизведите проблему с вашим приложением. Затем вернитесь к WPR и нажмите кнопку «Сохранить». Затем загрузите анализатор производительности Windows и откройте этот * .ETL-файл, который был сгенерирован. Затем вы хотите перейти в раздел «Активность системы» в окне «Графический проводник», развернуть его и найти график задержки пользовательских интерфейсов (или это может быть первый граф, припаркованный в Системной активности). Дважды щелкните по нему, чтобы получить подробную версию на вкладке «Анализ».

Как только вы найдете задержку пользовательского интерфейса, которую вы заинтересовали, вы можете добавить еще один график, например, использование ЦП (сэмплирование) из узла «Обработка» в Graph Explorer. Когда эти два графика находятся на одной вкладке Analysis, их прокрутка и выбор будут синхронизированы. Таким образом, вы можете нажать на событие задержки UI, а также выделить соответствующий диапазон в использовании ЦП.

+0

Ссылка выше мертва, попробуйте это https://www.microsoft.com/en-US/download/details.aspx?id=39982 это показывает мне только ADK для Win 8.1 ... – Jakob

+0

Я думаю, что это часть SDK теперь, начиная с Windows 10. https://dev.windows.com/en-us/downloads/windows-10-sdk –

2

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

Это то, что, кажется, будет доступна на событии Применение Ханг:

Сообщение: висячие Приложение% 1, версия 2%, подвесить модуль% 3, версия 4%, повесьте адреса с 0x% 5.

От:

http://www.microsoft.com/technet/support/ee/transform.aspx?ProdName=Windows+Operating+System&ProdVer=5.2&EvtID=1002&EvtSrc=Application+Hang&LCID=1033

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

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

2

Я бы подошел к этому, просмотрев код в модуле, который определил Windows, имя которого было записано в журнал событий. Попытка получить больше деталей в событии зависания будет невозможна, потому что, когда Windows определила, что приложение не отвечает, слишком поздно.

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

Windows считает, что приложение зависло, поскольку оно перестало отвечать на сообщения. К сожалению, реализация второго потока в вашем приложении VB6 не является тривиальной, в отличие от .NET. Тем не менее, добавив еще один поток, приложение будет реагировать, но тогда вы, вероятно, все равно останетесь с ответом на вопрос: «Почему код так долго выполняется?»

0

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

Смежные вопросы