【问题标题】:How can I determine the cause of an AppCrash on Unhandled Exception in Kernelbase.dll prior to Application Start?如何在应用程序启动之前确定 Kernelbase.dll 中未处理的异常导致 AppCrash 的原因?
【发布时间】:2018-01-02 11:33:59
【问题描述】:

应用程序在启动时崩溃,事件日志中的应用程序错误提供以下信息:
错误模块名称:KERNELBASE.dll,版本:6.2.15063.483,时间戳:0xc3955624
异常代码:0xe0434f4d
故障偏移:0x000eb802

这是背景故事
在我们客户的一个网络上,我们的应用程序甚至在打开之前就崩溃了。我现在花了几天时间寻找答案,但还没有解决这个问题。我从一些基本的故障排除开始,在没有发现任何确凿证据之后,但发现新的用户配置文件解决了这个问题,我建议这是一个很好的修复,可以重新启动并运行。他们的外包 IT 起初同意,但在将用户数据迁移到新配置文件时遇到了困难,并且始终无法完成将受影响的用户迁移到新配置文件的工作。现在问题出现在他们网络上的另一台机器上,他们正在回击说问题出在我们的应用程序上,我们应该花时间修复它。我同意,如果它在我们的代码中,我们应该修复它,但到目前为止,它似乎还不足以到达我们的代码。此外,我们在其他任何地方都没有看到这种情况,除了在这个网络上使用两个帐户登录到使用本地帐户的域 PC。

申请信息

  • VB.NET Windows 窗体应用,面向 .NET 4.5
  • 是的,ApplicationEvents.vb 文件中存在应用程序事件处理程序 UnhandledException。

用户环境信息

  • 域网络,在域 PC 上,但使用具有本地管理员帐户类型的非域本地帐户登录。这影响的两个用户都使用本地帐户登录。到目前为止,这不会影响任何使用域帐户登录的人。
    编辑:更正,发生这种情况的第二台 PC 实际上并未加入域。
  • Workstation 正在运行 Windows 10 专业版 v1703,更新是最新的
  • 如果以 Elevated 方式运行,应用程序可以正常启动,但这会导致以后出现其他问题,因此让它们始终以管理员身份运行是不可接受的解决方案。
  • 应用程序在这台 PC 上运行良好,直到最近更新。
  • 如果我们使用具有或不具有本地管理员权限的新域或非域帐户登录,则不会出现此问题。它似乎只与看到问题的特定用户个人资料有关

到目前为止的故障排除

  • 在线阅读了数十篇有关 kernelbase.dll 崩溃的帖子,但找不到有效的修复方法
  • 卸载并重新安装应用程序
  • 使用添加/删除 Windows 组件卸载并重新安装 .NET
  • 在 Application.Startup 事件中添加了一些事件日志条目,并在 Splash 屏幕和 Startup 表单上的 Load 事件中添加了一些事件日志条目,以查看我们是否达到了那一步。在工作站上对此进行了测试,并且记录成功。在受影响的机器上,不会发生日志记录,因此看起来崩溃甚至在 Application.Startup 事件之前就已经发生了。
  • 使用 ProcMon 在应用程序崩溃时对其进行监控,进程退出前的最后一行是对 C:\Windows\System32\ntdll.dll 的操作 QueryNameInformationFile em> 结果为 SUCCESS。我有 ProcMon 日志从正常运行(崩溃)和运行提升(没有崩溃)。我试过比较,但有成千上万的条目,没有什么是真正突出的原因。

  • 研究并使用了一些调试工具来收集更多的数据,包括ProcMon、ProcDump和WinDbg。到目前为止,我在这里发现的唯一东西是相同的 kernelbase.dll 异常信息,但只提供了代码,没有任何有意义的消息。我在加载符号时遇到了问题,但我想我明白了。我是 WinDbg 的新手,所以我可能没有 100% 拨入它。我无法让它使用 .loadby sos clr 成功加载 CLR。我不得不使用这项工作来加载 SOS,使用 .load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.dll 甚至尝试过 c:\windows\ Microsoft.NET\Framework\v4.0.30319\clr.dll,但我仍然只得到编码的异常信息,没有简单的英文消息。这是加载使用 ProcDump 制作的转储文件后在 WinDbg 中使用 .excr 时得到的结果

    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
    
  • 我尝试在 WinDbg 中使用 !clrstk,但它显示“未找到导出 clrstk”

问题

对我来说,似乎在应用启动之前发生了未处理的 CLR 异常,可能是因为文件或注册表项上的某些 Windows 权限冲突,但我不知道如何进一步追踪它。

  • 如何找到有关正在发生的特定异常的更多信息?我在网上找不到 kernelbase.dll 的故障偏移代码列表。
  • 我还能检查什么?

【问题讨论】:

  • 根据您对“未处理异常”处理程序的描述,您正在使用 VB 的应用程序框架提供的事件。据我了解,这只捕获主 UI 线程上的异常。我建议您尝试AppDomain.UnhandledException Event。您应该能够继续使用应用程序框架并在其Startup 事件处理程序中连接AppDomain.CurrentDomain.UnhandledException。这样做可以让您捕获一些有用的信息。
  • 我试过这个,但没有运气。我首先尝试将 AddHandlers 添加到 AppDomain.UnhandledException 和 System.Windows.Forms.ThreadException 的 MyApplication.Startup 事件中。我得到了同样的结果。它似乎没有运行 Startup 事件中的任何代码。我通过在 Startup 事件开始时添加一些代码来提供一些反馈(包括 msgbox 和写入事件日志)来证明这一点。我还尝试禁用应用程序框架并改用 Main() sub 并得到完全相同的结果。它在运行 Main() 中的任何代码之前崩溃。
  • 在这个问题上我仍然把头撞在墙上,在这里或 technet 上没有得到任何帮助。我在机器上创建了一个具有相同权限的新本地帐户,并创建了一个 ProcMon 日志,并与崩溃的配置文件中的日志并排比较。前 60 行左右是相同的,但随后发生了很大变化。损坏的配置文件开始大量引用 apphelp.dll 并引用 AppCompatFlags 的注册表区域。就好像一个配置文件认为它需要在兼容模式下运行,而另一个则不需要。做的就是崩溃的那个。

标签: vb.net clr crash


【解决方案1】:

我能够解决此问题,因此该应用程序再次开始工作。在并排比较了两个 ProcMon 日志(一个来自崩溃的配置文件,另一个来自具有相同权限的新配置文件)后,我发现在崩溃的配置文件上,它很早就开始引用 apphelp.dll 并查看注册表中的 AppCompatFlags 键。这让我相信它正在尝试以兼容模式运行,而它不应该这样做。

即使我通过右键单击应用程序图标并查看属性来确定没有通过 UI 设置兼容模式,但仍然有一些记录存储在注册表中。我从以下键中删除了应用程序的条目,并将用户注销并重新登录,问题就消失了。公平地说,我还做了一些其他可能有所贡献的事情。我下载并运行了.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

【讨论】:

    猜你喜欢
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 2011-08-27
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    相关资源
    最近更新 更多