【问题标题】:How should you diagnose the error SEHException - External component has thrown an exception你应该如何诊断错误 SEHException - External component has throw an exception
【发布时间】:2010-11-21 18:44:18
【问题描述】:

每当用户报告诸如

之类的错误时

System.Runtime.InteropServices.SEHException - 外部组件抛出异常?

作为程序员,我可以做些什么来确定原因吗?

场景:一位用户(使用我公司编写的程序)报告了此错误。 这可能是也可能不是一次性错误。他们提到,在上个月,计算机已经两次“停止工作”。我从经验中吸取了教训,不要太从字面上理解这个描述,因为这通常意味着与计算机相关的人没有按预期工作。他们无法给我更多细节,我也找不到任何记录的错误。因此,它可能是也可能不是这个错误。

从堆栈跟踪来看,实际错误是在构造一个不直接调用任何互操作代码的类时,但可能由于对象可能是数据绑定到 DevExpress 网格的列表的一部分而变得复杂。

错误被未处理的异常例程“捕获”,该例程通常会关闭程序,但可以选择忽略并继续。如果他们选择忽略该错误,则程序继续工作,但在下次运行此例程时再次出现错误。但是,在关闭并重新启动我们的应用程序后,它并没有再次发生。

有问题的计算机似乎没有压力过大。它运行 Vista Business,有 2GB 内存,根据任务管理器只使用大约一半的内存,而我们的应用程序只有大约 200Mb。

还有另一条信息可能相关,也可能不相关。同一程序的另一部分使用第三方组件,该组件实际上是原生 dll 周围的 dotnet 包装器,并且该组件确实存在一个已知问题,在这种情况下,您偶尔会得到一个

试图读取或写入受保护的内存。这通常表明其他内存已损坏

组件制造商表示,我们内部使用的最新版本的组件已修复此问题,但尚未提供给客户。

鉴于错误的后果很小(没有工作丢失,重新启动程序并回到原来的位置最多只需要一分钟),并且客户很快就会得到一个新版本(带有更新了第三方组件),我显然可以祈祷,希望错误不会再次发生。

但是我还能做些什么吗?

【问题讨论】:

    标签: c# winforms .net-2.0 error-logging


    【解决方案1】:

    我在对正在设置的内存缓存运行单元测试时遇到此错误。它淹没了缓存。使缓存失效并重新启动虚拟机后,它工作正常。

    【讨论】:

      【解决方案2】:

      当应用程序驻留在网络共享上,并且设备(笔记本电脑、平板电脑等)在使用应用程序时与网络断开连接时,我遇到了此错误。就我而言,这是由于 Surface 平板电脑超出了无线范围。安装更好的 WAP 后没有问题。

      【讨论】:

      • 我在访问我的代码和第三方库以及一个客户环境中的不同类型的反射(GetAssemblyName、GetProperty、Activator 等)时随机获取它,与远程库类似地点。大量证据表明它是 .net 框架错误。
      • Andriy K:我不认为这是一个 .NET 问题,我认为网络共享上打开文件的句柄丢失\以某种方式丢失,可能是 Windows 中的错误或网络问题。程序集是内存映射的,并且会按需从磁盘中调入(定时炸弹),在内存不足的情况下也可能会丢弃内存。如果打开的文件句柄不稳定,这可能会化为乌有。 .NET 可能已经处理了它并重新打开了文件(解决了问题),但它可能很复杂。
      • 我也有同样的问题。我得到 System.Runtime.InteropServices.SEHException (0x80004005) 没有堆栈跟踪。这是 TargetInvocationException 的 InnerException。 TargetInvocationException 确实有堆栈跟踪,但对我来说毫无意义,因为它似乎来自 main 或 Application.Run。它的发生非常随机,主要是在晚上\晚上。我想唯一的“解决方案”是不要从网络驱动器运行:-|也许我添加了一个可以阻止这种情况的检查:stackoverflow.com/questions/8633680/…
      【解决方案3】:

      我的机器配置:

      操作系统:Windows 10 版本 1703 (x64)

      我在 Visual Studio 2017 社区版中调试 C# .Net 项目时遇到此错误。我通过在运行时加载的 C++ 程序集上执行 p/invoke 来调用本机方法。我遇到了 OP 报告的完全相同的错误。

      我意识到 Visual Studio 是使用不是计算机管理员的用户帐户启动的。然后我在另一个用户帐户下重新启动了 Visual Studio,该用户帐户是机器上的管理员。就这样。我的问题得到了解决,我再也没有遇到过这个问题。

      需要注意的一点是,在 C++ 程序集上调用的方法应该在注册表中写入少量内容。我没有去调试 C++ 代码来做一些 RCA,但我看到整个事情有可能失败,因为在 Windows 10 操作系统中编写注册表需要管理权限。所以早些时候,当 Visual Studio 在一个没有计算机管理权限的用户帐户下运行时,本机调用会失败。

      【讨论】:

        【解决方案4】:

        只是另一个信息... 今天在应用程序从 unc/network 路径启动的 Windows 2012 R2 x64 TS 系统上遇到了这个问题。针对所有终端服务器用户的一个应用程序出现此问题。 在本地执行应用程序没有问题。重启后它又开始工作了——抛出的 SEHException 是 Constructor init 和 TargetInvocationException

        【讨论】:

          【解决方案5】:

          当我的程序第一次使用本机 dll 包装器时,我遇到了一个类似的 SEHException 问题。结果发现该包装器的本机 DLL 丢失了。这个例外对解决这个问题没有任何帮助。最终的帮助是在后台运行 procmon 并检查在加载所有必要的 DLL 时是否有任何错误。

          【讨论】:

            【解决方案6】:

            如果您遇到本文中描述的问题:

            asp.net mvc debugger throwing SEHException

            那么解决方法是:

            如果您有来自 Trusteer 的任何应用程序(例如 rapport 或其他任何东西),只需卸载并重新启动您的系统,它就可以正常工作......在这里找到了这个解决方案:

            http://forums.asp.net/t/1704958.aspx/8/10?Re+SEHException+thrown+when+I+run+the+application

            【讨论】:

              【解决方案7】:

              组件制造商表示,我们在内部使用的最新版本的组件中已修复此问题,但尚未提供给客户。

              询问组件制造商如何测试客户遇到的问题是否是他们声称已在最新版本中修复的问题,而无需/在将最新版本部署给客户之前。

              【讨论】:

                【解决方案8】:

                是的。此错误是未映射到 .NET 错误的结构化异常。可能是您的 DataGrid 映射引发了未捕获的本机异常。

                您可以通过查看ExternalException.ErrorCode 属性来判断发生了什么异常。我会检查您的堆栈跟踪,如果它与 DevExpress 网格相关联,请将问题报告给他们。

                【讨论】:

                • StackTrace 没有在任何地方提到 DevExpress,只提到了我的班级。必须检查一下 ErrorCode 是什么。
                • 在这种情况下,请尝试找出究竟是什么引发了错误消息。
                • “通过查看 ExternalException.ErrorCode 属性”——你对如何做到这一点有任何提示吗? VS 向我显示“在 ....dll 中发生了类型为 'System.Runtime.InteropServices.SEHException' 的未处理异常附加信息:Eine externe Komponente hat eine Ausnahme ausgelöst。”,但不是在例如C# 应用程序,没有任何链接可以查看异常对象的“详细信息”。
                • VSCode 的调试器在 Locals 下显示一个 $exception 实例 - 这包括一个 Message 字段,其中包括代码和人类可读的错误消息。
                猜你喜欢
                • 1970-01-01
                • 2016-07-27
                • 2017-10-02
                • 2015-08-20
                • 2017-04-16
                • 2019-07-08
                • 1970-01-01
                • 1970-01-01
                • 2019-04-04
                相关资源
                最近更新 更多