Как я могу определить причину AppCrash на необработанное исключение в Kernelbase.dll до запуска приложения?

При запуске приложения происходит сбой, и ошибка приложения в журнале событий дает следующую информацию:
Неверное имя модуля: KERNELBASE.dll, версия: 6.2.15063.483, отметка времени: 0xc3955624
Код исключения: 0xe0434f4d
Смещение ошибки: 0x000eb802

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

Информация о приложении

  • Приложение VB.NET для Windows Forms, ориентированное на.NET 4.5
  • Да, в файле Application Events.vb есть обработчик события приложения, представляющий исключение UnhandledException.

Информация о среде пользователя

  • Доменная сеть, на ПК с доменом, но вошедшая в систему с локальной учетной записью без домена с типом учетной записи локального администратора. Два пользователя, на которых это влияет, оба входят в систему с локальными учетными записями. Пока что это не влияет на то, кто входит в систему с учетной записью домена.
    РЕДАКТИРОВАТЬ: Исправление, второй компьютер, на котором это происходит, на самом деле не присоединен к домену.
  • Рабочая станция работает под управлением Windows 10 Pro v1703 с текущими обновлениями
  • Приложение запускается нормально, если запускается с повышенными правами, но это вызывает другие проблемы позже, поэтому их всегда запускать от имени администратора не является приемлемым решением.
  • Приложение работало нормально на этом ПК до недавнего обновления.
  • Эта проблема не возникает, если мы входим в систему с новым доменным или не доменным аккаунтом с правами локального администратора или без них. Кажется, это связано только с конкретным профилем пользователя, который видит проблемы

Устранение неполадок до настоящего времени

  • Прочитайте десятки сообщений онлайн, посвященных сбоям kernelbase.dll, и не смогли найти ни одного исправления, которое работало
  • Деинсталлировал и переустанавливал приложение
  • Удаление и повторная установка.NET с помощью компонента "Установка и удаление компонентов Windows".
  • Добавлены некоторые записи в журнале событий в событии Application.Startup и в событии Load на экране Splash и в форме запуска, чтобы увидеть, насколько мы продвинулись. Протестировано на рабочих станциях, и регистрация прошла успешно. На затронутых машинах регистрация не происходит, поэтому кажется, что сбой происходит еще до события Application.Startup.
  • Использовал ProcMon для мониторинга приложения во время его сбоя, и последней строкой перед выходом из процесса является операция QueryNameInformationFile для C:\Windows\System32\ntdll.dll с результатом SUCCESS. У меня журналы ProcMon работают нормально (с падением) и запускаются Elevated (без сбоя). Я попытался сравнить, но есть тысячи записей, и ничто действительно не выделяется как причина.

  • Исследовали и использовали некоторые средства отладки для сбора дополнительных данных, включая ProcMon, ProcDump и WinDbg. Пока единственное, что я нашел здесь, это та же самая информация об исключении kernelbase.dll, но только коды предоставлены, а не осмысленные сообщения. У меня были проблемы с загрузкой символов, но я понял это. Я новичок в WinDbg, поэтому я не могу набрать его в 100%. Я не смог заставить его успешно загрузить CLR, используя .loadby sos clr. Мне пришлось использовать эту работу вокруг, чтобы загрузить SOS, используя .load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.dll и даже пробовал c: \ windows \ Microsoft.NET \ Framework \ v4.0.30319 \ clr.dll, но я все еще получаю только информацию об кодированных исключениях и никаких сообщений на простом английском языке. Вот что я получаю при использовании.excr в WinDbg после загрузки файла дампа, созданного с помощью ProcDump

    eax=01fcf898 ebx=e0434f4d ecx=00000001 edx=00000000 esi=01fcf928 edi=022da1e0
    eip=7453b802 esp=01fcf898 ebp=01fcf8f0 iopl=0         nv up ei pl nz ac po nc
    cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000212
    KERNELBASE!RaiseException+0x62:
    7453b802 8b4c2454        mov     ecx,dword ptr [esp+54h] ss:002b:01fcf8ec=0911506f
    
  • Я попытался использовать! Clrstk в WinDbg, но там написано "Экспорт не найден"

Вопросы

Мне кажется, что существует необработанное исключение CLR, возникающее до запуска приложения, возможно, из-за некоторых конфликтов разрешений Windows либо для файла, либо для записи в реестре, но я не знаю, как отследить его дальше.

  • Как я могу узнать больше информации о конкретном исключении, которое происходит? Я не смог найти список кодов смещения ошибки для kernelbase.dll онлайн.
  • Что еще я могу проверить?

2 ответа

Решение

Мне удалось это исправить, поэтому приложение снова заработало. После сравнения двух журналов ProcMon бок о бок (один из профиля, который был сбой, и один из нового профиля с такими же правами) я обнаружил, что в профиле, который был сбой, он начал очень рано ссылаться на apphelp.dll и посмотреть на Ключи AppCompatFlags в реестре. Это заставило меня поверить в то, что он пытался работать в режиме совместимости, что не нужно делать.

Несмотря на то, что я позаботился о том, чтобы через интерфейс пользователя не был установлен режим совместимости, щелкнув правой кнопкой мыши значок приложения и просмотрев свойства, в реестре все еще были некоторые записи. Я удалил записи для приложения из следующих ключей и выполнил вход пользователя и снова, и проблема исчезла. Чтобы быть справедливым, я также сделал несколько других вещей, которые могли помочь. Я скачал и запустил .NET Repair Tool. Это не решило проблему сразу после запуска, но я подумал, что упомяну об этом на всякий случай, если это сыграет свою роль. Сначала я запустил ремонтный комплект, затем нашел и удалил записи реестра, а затем вышел из системы и вернулся обратно.

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

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Persisted

В моем случае код исключения привел меня к коду исключения: 0xe0434f4d

Как упоминалось в посте, хитрость заключалась в установленной версии .net framework и поддерживаемом ключе Runtime в app.config.

Другие вопросы по тегам