如何在应用程序启动之前确定 Kernelbase.dll 中未处理异常导致 AppCrash 的原因?
How can I determine the cause of an AppCrash on Unhandled Exception in Kernelbase.dll prior to Application Start?
应用程序在启动时崩溃,事件日志中的应用程序错误提供以下信息:
故障模块名称:KERNELBASE.dll,版本:6.2.15063.483,时间戳:0xc3955624
异常代码:0xe0434f4d
故障偏移量:0x000eb802
这是背景故事
在我们客户的一个网络上,我们的应用程序甚至在打开之前就崩溃了。我现在花了几天时间寻找答案,但还没有解决这个问题。我从一些基本的故障排除开始,在没有找到任何确凿证据后,但发现新的用户配置文件解决了问题,我建议这是一个很好的修复,可以重新启动并再次 运行ning。他们的外包 IT 起初同意,但在将用户数据迁移到新配置文件时遇到了困难,并且从未能够完成将受影响的用户迁移到新配置文件。现在问题出现在他们网络上的另一台机器上,他们反驳说问题出在我们的应用程序上,我们应该花时间修复它。我同意,如果它在我们的代码中,我们应该修复它,但到目前为止,它似乎还不足以到达我们的代码。此外,我们在其他任何地方都没有看到这种情况,除了在这个网络上,这两个帐户使用本地帐户登录到域 PC。
申请信息
- VB.NET Windows Forms 应用,面向 .NET 4.5
- 是的,ApplicationEvents.vb 文件中存在应用程序事件处理程序 UnhandledException。
用户环境信息
- 域网络,在域 PC 上,但使用本地管理员帐户类型的非域本地帐户登录。这影响的两个用户都使用本地帐户登录。到目前为止,这不会影响任何使用域帐户登录的人。
编辑:更正,发生这种情况的第二台 PC 实际上没有加入域。
- 工作站是 运行ning Windows 10 Pro v1703,更新为当前
- 如果 运行 提升,应用程序可以正常启动,但这会在以后导致其他问题,因此让他们始终 运行 作为管理员不是一个可接受的解决方案。
- 应用程序 运行 在这台 PC 上运行良好,直到最近更新。
- 如果我们使用具有或不具有本地管理员权限的新域或非域帐户登录,则不会出现此问题。似乎只与看到问题的特定用户个人资料有关
到目前为止的故障排除
- 在线阅读了数十篇处理 kernelbase.dll 崩溃的帖子,但找不到可以解决问题的帖子
- 卸载并重新安装应用程序
- 使用 Add/Remove Windows 组件卸载并重新安装 .NET
- 在 Application.Startup 事件中添加了一些事件日志条目,并在启动屏幕和启动窗体上添加了加载事件,以查看我们是否达到了那个程度。在工作站上对此进行了测试,并且记录成功。在受影响的机器上,没有日志记录发生,因此似乎崩溃甚至在 Application.Startup 事件之前就发生了。
在应用程序崩溃时使用 ProcMon 进行监控,进程退出前的最后一行是操作 QueryNameInformationFile 到 C:\Windows\System32\ntdll.dll 结果为 SUCCESS。我有 运行ning 正常(崩溃)和 运行ning 提升(没有崩溃)的 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 但它显示 "No export clrstk found"
问题
对我来说,似乎在应用程序启动之前发生了未处理的 CLR 异常,可能是因为文件或注册表项上的一些 windows 权限冲突,但我不知道如何追踪再进一步。
- 如何找到有关发生的特定异常的更多信息?我无法在线找到 kernelbase.dll 的故障偏移代码列表。
- 我还能检查什么?
我能够解决这个问题,所以应用程序又开始工作了。在并排比较两个 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
应用程序在启动时崩溃,事件日志中的应用程序错误提供以下信息:
故障模块名称:KERNELBASE.dll,版本:6.2.15063.483,时间戳:0xc3955624
异常代码:0xe0434f4d
故障偏移量:0x000eb802
这是背景故事
在我们客户的一个网络上,我们的应用程序甚至在打开之前就崩溃了。我现在花了几天时间寻找答案,但还没有解决这个问题。我从一些基本的故障排除开始,在没有找到任何确凿证据后,但发现新的用户配置文件解决了问题,我建议这是一个很好的修复,可以重新启动并再次 运行ning。他们的外包 IT 起初同意,但在将用户数据迁移到新配置文件时遇到了困难,并且从未能够完成将受影响的用户迁移到新配置文件。现在问题出现在他们网络上的另一台机器上,他们反驳说问题出在我们的应用程序上,我们应该花时间修复它。我同意,如果它在我们的代码中,我们应该修复它,但到目前为止,它似乎还不足以到达我们的代码。此外,我们在其他任何地方都没有看到这种情况,除了在这个网络上,这两个帐户使用本地帐户登录到域 PC。
申请信息
- VB.NET Windows Forms 应用,面向 .NET 4.5
- 是的,ApplicationEvents.vb 文件中存在应用程序事件处理程序 UnhandledException。
用户环境信息
- 域网络,在域 PC 上,但使用本地管理员帐户类型的非域本地帐户登录。这影响的两个用户都使用本地帐户登录。到目前为止,这不会影响任何使用域帐户登录的人。
编辑:更正,发生这种情况的第二台 PC 实际上没有加入域。 - 工作站是 运行ning Windows 10 Pro v1703,更新为当前
- 如果 运行 提升,应用程序可以正常启动,但这会在以后导致其他问题,因此让他们始终 运行 作为管理员不是一个可接受的解决方案。
- 应用程序 运行 在这台 PC 上运行良好,直到最近更新。
- 如果我们使用具有或不具有本地管理员权限的新域或非域帐户登录,则不会出现此问题。似乎只与看到问题的特定用户个人资料有关
到目前为止的故障排除
- 在线阅读了数十篇处理 kernelbase.dll 崩溃的帖子,但找不到可以解决问题的帖子
- 卸载并重新安装应用程序
- 使用 Add/Remove Windows 组件卸载并重新安装 .NET
- 在 Application.Startup 事件中添加了一些事件日志条目,并在启动屏幕和启动窗体上添加了加载事件,以查看我们是否达到了那个程度。在工作站上对此进行了测试,并且记录成功。在受影响的机器上,没有日志记录发生,因此似乎崩溃甚至在 Application.Startup 事件之前就发生了。
在应用程序崩溃时使用 ProcMon 进行监控,进程退出前的最后一行是操作 QueryNameInformationFile 到 C:\Windows\System32\ntdll.dll 结果为 SUCCESS。我有 运行ning 正常(崩溃)和 运行ning 提升(没有崩溃)的 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 但它显示 "No export clrstk found"
问题
对我来说,似乎在应用程序启动之前发生了未处理的 CLR 异常,可能是因为文件或注册表项上的一些 windows 权限冲突,但我不知道如何追踪再进一步。
- 如何找到有关发生的特定异常的更多信息?我无法在线找到 kernelbase.dll 的故障偏移代码列表。
- 我还能检查什么?
我能够解决这个问题,所以应用程序又开始工作了。在并排比较两个 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