您应该如何诊断错误SEHException-外部组件引发了异常


86

每当用户报告错误时,例如

System.Runtime.InteropServices.SEHException-外部组件引发了异常?

作为程序员,我有什么能确定原因的?

场景:一个用户(使用我公司编写的程序)报告了此错误。这可能是也可能不是一次错误。他们提到,在过去的一个月中,计算机两次“停止工作”。我从经验中学到了,不要从字面上理解此描述,因为这通常意味着与计算机有关的某人未按预期工作。他们无法向我提供更多详细信息,并且我找不到任何记录的错误。因此,可能是也可能不是这个错误。

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

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

有关计算机似乎并没有受到压力。它运行的是Vista Business,具有2GB的内存,而根据Task Manager的估计,我们的应用程序仅使用了一半的内存,仅为200Mb。

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

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

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

鉴于错误的后果很低(不会丢失任何工作,并且无需重新启动程序,最多只需花费一分钟即可恢复到原来的状态),并且考虑到客户很快就会获得新版本(更新的第三版派对组件),我显然可以用手指指望,并且不会再次发生该错误。

但是我还能做些什么吗?

Answers:


28

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

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


1
StackTrace在任何地方都没有提到DevExpress,而只是我的课程。将必须检查以查看ErrorCode是什么。
sgmoore

在这种情况下,请尝试找出引发错误消息的确切原因。
里德·科普西

4
“通过查看ExternalException.ErrorCode属性”-您对如何确切地执行操作有任何提示吗?VS向我显示“在.... dll中发生了'System.Runtime.InteropServices.SEHException类型的未处理的异常。在任何地方查看异常对象的“详细信息”。
或Mapper

8

我的程序首次使用本机dll包装程序时引发了SEHException,我遇到了类似的问题。原来,该包装程序的本机DLL丢失了。该异常绝无助于解决此问题。最终的帮助是在后台运行procmon,并在加载所有必需的DLL时检查是否有任何错误。



3

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

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


1

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


1
在我的代码库和第三方库中以及仅在一个客户环境中(类似于远程库)访问不同类型的反射(GetAssemblyName,GetProperty,Activator等)时,我是随机获取的。大量证据表明它是.net框架错误。
Andriy K

Andriy K:我不认为这是.NET问题,我认为网络共享上打开的文件句柄以某种方式丢失/丢失,可能是Windows中的错误或网络问题。程序集是内存映射的,将按需从磁盘分页(定时炸弹),可能在内存不足的情况下也可以丢弃该内存。如果打开的文件手柄不稳定,则可能会冒烟。.NET可能已经处理了它并重新打开了文件(解决了问题),但是它可能很复杂。
osexpert

我也有同样的问题。我得到没有堆栈跟踪的System.Runtime.InteropServices.SEHException(0x80004005)。这是TargetInvocationException的InnerException。TargetInvocationException的确具有堆栈跟踪,但是对我来说没有意义,因为它似乎来自main或Application.Run。它的发生非常随机,主要是在晚上/晚上。我猜唯一的“解决方案”是不要从网络驱动器运行:也许我添加了可以阻止这种情况的检查:stackoverflow.com/questions/8633680/…–
osexpert

0

只是另一个信息...今天在Windows 2012 R2 x64 TS系统上出现了此问题,该应用程序是从unc /网络路径启动的。对于所有终端服务器用户,只有一个应用程序发生了此问题。在本地执行应用程序可以正常工作。重新启动后,它再次开始工作-SEHException的抛出是Constructor init和TargetInvocationException


0

我的机器配置:

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

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

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

需要注意的一件事是,在C ++程序集上被调用的方法应该在注册表中写一些东西。我没有去调试C ++代码来执行一些RCA,但我发现整个事情都失败了,因为在Windows 10操作系统中编写注册表需要管理特权。因此,当Visual Studio在用户帐户上运行时,该帐户在计算机上没有管理权限,因此本机调用失败。


0

我在设置的内存缓存上运行单元测试时遇到此错误。它淹没了缓存。使缓存无效并重新启动VM之后,它可以正常工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.