如何在应用程序启动之前确定Kernelbase.dll中未处理异常的AppCrash原因?

时间:2017-07-26 23:16:17

标签: vb.net clr crash

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

这是背景故事
在我们的一个客户网络上,我们的应用程序在打开之前就崩溃了。我现在花了几天时间寻找答案,而且还没有能够解决这个问题。我从一些基本的故障排除开始,在没有找到任何吸烟枪,但发现一个新的用户配置文件解决了这个问题之后,我建议这是一个很好的修复,可以重新启动并重新运行。他们的外包IT一开始就同意了,但是很难将用户数据迁移到新的配置文件,并且从未能够将受影响的用户移动到新的配置文件。现在问题发生在他们网络上的另一台机器上,他们正在推回说明问题出在我们的应用程序上,我们应该花时间来修复它。我同意,如果它在我们的代码中我们应该修复它,但到目前为止它似乎还远远不足以达到我们的代码。此外,我们还没有在其他任何地方看到这个,除了在这个网络上有两个帐户登录到具有本地帐户的域PC。

应用信息

  • VB.NET Windows Forms应用程序,面向.NET 4.5
  • 是的,ApplicationEvents.vb文件中存在一个Application Event处理程序,显示UnhandledException。

用户环境信息

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

到目前为止的疑难解答

  • 在线阅读几十篇关于kernelbase.dll崩溃的帖子,而且找不到一个有效修复的帖子
  • 已卸载并重新安装该应用程序
  • 使用“添加/删除Windows组件”卸载并重新安装.NET
  • 在Application.Startup事件中添加了一些事件日志条目,在Splash屏幕和Startup表单中添加了Load事件,看看我们是否已经走得那么远。在工作站上测试了这一点并且记录成功。在受影响的计算机上,不会发生日志记录,因此似乎甚至在Application.Startup事件发生之前就发生了崩溃。
  • 使用ProcMon监控应用程序崩溃,Process Outits之前的最后一行是Operation QueryNameInformationFile C:\ Windows \ System32 \ ntdll.dll 结果为 SUCCESS 。我让ProcMon日志正常运行(崩溃)并运行Elevated(没有崩溃)。我试图比较,但有成千上万的条目,没有什么真正突出的原因。

  • 研究并使用了一些调试工具来收集更多数据,包括ProcMon,ProcDump和WinDbg。到目前为止,我在这里找到的唯一的东西是相同的kernelbase.dll异常信息,但只提供代码,没有有意义的消息。我在加载符号时遇到了问题,但我想我已经明白了。我是WinDbg的新手,所以我可能没有100%拨打它。我无法使用 .loadby sos clr 成功加载CLR。我不得不使用 .load C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ SOS.dll 来加载SOS,甚至尝试 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的故障偏移代码列表。
  • 我还能检查什么?

1 个答案:

答案 0 :(得分:2)

我能够解决这个问题,以便应用程序重新开始工作。在并排比较两个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