如何在应用程序启动之前确定 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。

申请信息

用户环境信息

到目前为止的故障排除

问题

对我来说,似乎在应用程序启动之前发生了未处理的 CLR 异常,可能是因为文件或注册表项上的一些 windows 权限冲突,但我不知道如何追踪再进一步。

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