【发布时间】: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 的注册表区域。就好像一个配置文件认为它需要在兼容模式下运行,而另一个则不需要。做的就是崩溃的那个。