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

标签 vb.net clr crash

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

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

应用信息

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

  • 用户环境信息
  • 在域PC上的域网络,但使用具有本地管理员帐户类型的非域本地帐户登录。这影响的两个用户都使用本地帐户登录。到目前为止,这并不影响任何使用域帐户登录的人。编辑:更正,正在发生的第二台PC实际上未加入域。
  • 工作站正在运行Windows 10 Pro v1703,并更新了最新的
  • 如果运行“升高”,则应用程序可以正常启动,但是稍后会导致其他问题,因此让它们始终以管理员身份运行是不可接受的解决方案。
  • 该应用程序在此PC上运行良好,直到进行了最新更新。
  • 如果我们使用具有或没有本地管理员权限的新域或非域帐户登录,则不会发生此问题。似乎仅与看到问题
  • 的特定用户个人资料有关

    到目前为止的疑难解答
  • 在线阅读数十篇有关kernelbase.dll崩溃的帖子,找不到具有可修复
  • 的修复程序
  • 卸载并重新安装应用程序
  • 使用“添加/删除Windows组件”卸载并重新安装.NET
  • 在“启动”屏幕和“启动”表单上的Application.Startup事件和Load事件中添加了一些事件日志条目,以查看是否达到目标。在工作站上对此进行了测试,并且记录成功。在受影响的计算机上,不会发生任何日志记录,因此,即使在Application.Startup事件发生之前,崩溃似乎也正在发生。
  • 使用ProcMon监视应用程序崩溃后,进程退出前的最后一行是对C:\ Windows \ System32 \ ntdll.dll的操作QueryNameInformationFile,结果为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的Fault Offset代码列表。
  • 我还能检查什么?
  • 最佳答案

    我能够解决此问题,因此该应用程序再次开始工作。并排比较两个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
    

    关于vb.net - 在启动应用程序之前,如何确定Kernelbase.dll中未处理的异常导致AppCrash的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45338908/

    相关文章:

    c++ - Visual Studio 2008 - vftable 指针不正确? Debug模式崩溃,Release没问题

    eclipse - 为什么我的 Eclipse Indigo 在带有 Oracle JDK 64 位的 Ubuntu 13.04 上崩溃?

    vb.net - Microsoft.VisualBasic.dll 中记录的一堆异常

    c - 从 C 中具有多个 NULL '\0' 的函数返回字符串

    CLR 上的 Clojure

    c# - 如何查看标记为 MethodImplOptions.InternalCall 的方法代码?

    ios - 使用 iOS 5 启动时应用程序崩溃 - 无法重现

    .net - TBBUTTON 结构不适用于 SendMessage

    c# - RGB/十六进制颜色到十进制值

    c# - String.Format - 它是如何工作的以及如何实现自定义格式字符串