Что означают детали сообщения APPCRASH?
Я испытываю APPCRASH из моего приложения на C#. Среда выполнения выдает сообщение об ошибке "Это приложение запросило среду выполнения, чтобы завершить его необычным способом". Затем, когда я нажимаю "ОК", я получаю сообщение "MyApplication прекратило работать" с обычными опциями "проверить решение онлайн", "закрыть программу" и "отладочная программа". Когда я нажимаю "дополнительные данные", я получаю подпись APPCRASH с большим количеством дополнительной информации. Некоторые из них читаются человеком, а некоторые - просто шестнадцатеричные числа. "Код исключения" - 40000015. Есть также строки "Дополнительная информация". Мой вопрос: знает ли кто-нибудь во вселенной, что означает информация в сообщении APPCRASH?
Кажется, что сообщение предназначено для прочтения кем-то, кто может предугадать причину. При поиске ответов я обнаружил, что многие люди публикуют сообщения в одинаковом формате. К сожалению, я не нашел объяснений, что означает эта информация.
Кроме того, я пробовал опцию "Отладка программы", но она бесполезна. Это просто помещает меня в системные dll без кода в стеке вызовов. Я исследовал, и ошибка не возникает в этом системном коде.
Сообщение APPCRASH назвало другую dll как "Fault Module" (этот код использует много внешних dll), и там, вероятно, происходит фатальная ошибка. Но эта информация не очень полезна, потому что мне нужно найти место в моем коде, которое делает неправильный вызов внешней DLL (или переводит ее в плохое состояние). К сожалению, когда я говорю "мой код", я имею в виду код, с которым я работаю. Это огромная кодовая база, написанная несколькими десятками людей за пару лет, поэтому я не могу просто угадать места, которые могут сделать роковой вызов. Вот почему я надеялся узнать больше информации из сообщения APPCRASH. Вот почему я очень скуп на детали. Все это очень запатентовано с большим количеством бюрократизма. Вот почему я не опубликовал содержание сообщения APPCRASH.
Чтобы было ясно, я не прошу вас отладить мою проблему для меня. Я не могу представить вам воспроизводимый случай ошибки, и я не прошу никого сообщать мне причину ошибки в моем конкретном случае. Я просто хочу знать, как интерпретировать эти шестнадцатеричные числа, и я не смог найти никакой документации.
4 ответа
Вот пример сообщения о сбое приложения:
Problem signature:
Problem Event Name: APPCRASH
Application Name: WINWORD.EXE
Application Version: 12.0.4518.1014
Application Timestamp: 45428028
Fault Module Name: StackHash_7ae5
Fault Module Version: 6.0.6000.16386
Fault Module Timestamp: 4549bdc9
Exception Code: c0000374
Exception Offset: 000af1c9
OS Version: 6.0.6000.2.0.0.256.4
Locale ID: 1033
Additional Information 1: 7ae5
Additional Information 2: 4cf2e59e469447e0692da79a5a9446de
Additional Information 3: 333f
Additional Information 4: 583336399425ab3efc33bdfbb60895ee
Имя приложения и версия приложения просты, как и метка времени (это дата изменения в Проводнике, закодированная как 32-битное значение метки времени Unix). Fault Module - это обычно имя dll, а смещение исключения - это адрес смещения аппаратной инструкции в DLL, которая вызвала ошибку. В этом случае это была внутренняя ошибка во время выполнения, когда не удалось найти действительный модуль, поэтому вместо реального значения мы получили StackHash. Версии - это обычные строки PE-версий исполняемых файлов в Windows. ID локали - это используемый банк настроек глобализации: 1033 - en-US.
Код исключения можно интерпретировать здесь. В этом примере ошибка была STATUS_HEAP_CORRUPTION.
Дополнительные информационные поля являются непрозрачными данными и основаны на коде исключения. Я не знаю никакой полезной информации об этих полях, скорее всего, ее нет, и, вероятно, эти поля преднамеренно недокументированы, чтобы Microsoft могла изменить их при необходимости. Эти поля, как правило, представляют собой хеши md5 с большим количеством информации... в основном это так, чтобы можно было быстро сравнивать большое количество информации, чтобы оно было одинаковым / различным с помощью хеш-кода, чтобы вы знали, происходит ли ошибка из-за того же состояния выполнения, что и другое,
Это означает, что у вас есть необъяснимое исключение, и это приводит к сбою приложения.
Если он работает в режиме отладки, вам нужно посмотреть, что отличает релизную версию. Все ли библиотеки присутствуют? У вас есть настройки app.config?
Проверьте программу просмотра событий в разделе Журналы Windows -> Приложение для получения дополнительной информации.
Если вы настроите обработчик исключений, вы получите намного лучшую информацию, такую как трассировка стека.
В.net, Managed Debugger Assistants, есть полезная функция для устранения неполадок взаимодействия с собственным и управляемым кодом. Статья MSDN об ее использовании здесь.
Исключения, создаваемые MDA, можно настроить в окне просмотра исключений Visual Studio.
Вам необходимо создать аварийный дамп, который можно проанализировать после факта. Вам нужно будет внести некоторые изменения в реестр, а затем вы можете проанализировать файл дампа с помощью Visual Studio. Надеемся, что это даст вам больше подсказок, таких как конкретная функция, которая не работает.
Смотрите этот сайт для деталей: http://blog.functionalfun.net/2013/05/how-to-debug-silent-crashes-in-net.html
Вы будете настраивать DebugDiag, инструмент от Microsoft.
Дайте мне знать, как идут дела, или если вы найдете лучшие инструменты.
С Уважением,
Дейв