代码之家  ›  专栏  ›  技术社区  ›  Paul Hitchcock

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

  •  3
  • Paul Hitchcock  · 技术社区  · 8 年前

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


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

    应用程序信息

    • VB.NET Windows窗体应用程序,针对.NET 4.5
    • 是的,ApplicationEvents中有一个应用程序事件处理程序存在未处理的异常。vb文件。

    • 域网络,在域PC上,但使用具有本地管理员帐户类型的非域本地帐户登录。这影响到的两个用户都使用本地帐户登录。到目前为止,这不会影响任何使用域帐户登录的人。
      编辑:更正,发生这种情况的第二台电脑实际上没有加入域。
    • 工作站正在运行Windows 10 Pro v1703,更新最新
    • 如果提升运行,应用程序可以正常启动,但这会在以后导致其他问题,所以让它们始终以管理员身份运行是不可接受的解决方案。
    • 该应用程序在这台电脑上运行良好,直到最近更新。

    迄今为止的故障排除

    • 在线阅读数十篇关于kernelbase的帖子。dll崩溃,找不到可用的修复程序
    • 使用添加/删除Windows组件卸载和重新安装.NET
    • 在应用程序中添加了一些事件日志项。启动事件和启动屏幕上的Load事件以及启动窗体,以查看我们是否走到了这一步。在工作站上对此进行了测试,并成功地进行了日志记录。在受影响的机器上,不会发生日志记录,因此似乎在应用程序启动之前就发生了崩溃。启动事件。
    • QueryNameInformationFile 结果是 成功

    • 研究并使用了一些调试工具来收集更多的数据,包括ProcMon、ProcDump和WinDbg。到目前为止,我在这里唯一找到的是相同的内核库。dll异常信息,但只提供代码,没有有意义的消息。我在加载符号时遇到了问题,但我想我已经解决了。我是WinDbg的新手,所以我可能无法百分之百地拨打它。我无法使用它成功加载CLR .sos clr加载 .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”

    问题

    • 我如何才能找到有关正在发生的特定异常的更多信息?我找不到kernelbase的故障偏移代码列表。dll联机。
    • 我还能查什么?
    1 回复  |  直到 8 年前
        1
  •  2
  •   Paul Hitchcock    8 年前

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

    尽管我通过右键单击应用程序图标并查看属性来确保没有通过UI设置兼容性模式,但注册表中仍然存储了一些记录。我从以下键中删除了应用程序的条目,并将用户注销和重新登录,问题就解决了。公平地说,我还做了其他一些可能有贡献的事情。我下载并运行了 .NET Repair Tool .它没有在运行后立即解决问题,但我想我还是提一下,以防万一它起了作用。我首先运行了修复工具包,然后找到并删除了注册表项,然后将用户注销并重新登录。

    HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
    
    HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Persisted