如何诊断错误SEHException – 外部组件已引发exception

每当用户报告错误如

System.Runtime.InteropServices.SEHException – 外部组件已引发exception?

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

情景:一个用户(使用我公司写的程序)报告了这个错误。 这可能是也可能不是一个错误。 他们提到,在上个月,电脑有两次“停止工作”。 我从经验中学到了,不要太直接地去描述,因为这通常意味着有关计算机的人不能按预期工作。 他们无法给我更多的细节,我找不到任何logging的错误。 因此,它可能或可能不是这个错误。

从堆栈跟踪中,实际的错误是构build一个不直接调用任何interop代码的类,但可能由于该对象可能是一个绑定到DevExpress Grid的列表的一部分而变得复杂。

错误被一个未处理的exception例程“捕获”,通常会closures程序,但是可以忽略和继续。 如果他们select忽略这个错误,那么这个程序继续工作,但是当这个例程下一次运行的时候,错误会重新发生。 但是,在closures并重新启动我们的应用程序后,它不再发生。

有问题的电脑似乎没有压力。 它运行Vista商业,有2GB的内存,根据任务pipe理器只用了大约一半,我们的应用程序只有大约200Mb。

还有另外一条信息可能相关,也可能不相关。 同一个程序的另一部分使用了第三方组件,它实际上是一个本地dll的dotnet包装,而且这个组件确实有一个已知的问题,偶尔你会得到

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

这些组件制造商说,这已经在我们正在使用的最新版本的组件中得到修复,但是这还没有给客户。

由于错误的后果是很低的(没有工作丢失,重新启动程序并返回到最多只需要一分钟),并且客户很快就会得到一个新的版本(更新的第三版本,党的组成部分),我可以明显地跨过我的手指,并希望错误不会再发生。

但还有什么我可以做的吗?

是。 此错误是未映射到.NET错误的结构化的exception。 这可能是你的DataGrid映射抛出未捕获的本地exception。

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

我有一个SEHException类似的问题,当我的程序第一次使用本机的dll包装器时抛出。 原来,该包装的本地DLL丢失。 这个例外没有任何帮助解决这个问题。 最后有什么帮助是在后台运行procmon,并检查加载所有必要的DLL时是否有任何错误。

如果您遇到此post中描述的问题,请执行以下操作:

asp.net mvcdebugging器抛出SEHException

那么解决的办法是:

如果您有任何来自Trusteer的应用程序(如关系或任何)只需卸载并重新启动您的系统,它会正常工作…发现这个解决scheme在这里:

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

组件制造商说,这已经在我们正在使用的最新版本的组件中得到修复,但是这已经交给了客户。

询问组件制造商如何testing客户获得的问题是他们说他们已经在最新版本中修复的问题,而不是/在将最新版本部署到客户之前。

一个古老的问题,但对于googlers:我遇到了这个错误,当应用程序驻留在networking共享,并且该设备(笔记本电脑,平板电脑,…)变得从networking断开,而应用程序正在使用。 就我而言,这是由于Surface平板电脑走出无线范围。 安装更好的WAP后没有问题。

只是另一个信息…今天在Windows 2012 R2 x64 TS系统上的应用程序是从一个unc /networkingpath启动的问题。 所有terminal服务器用户的问题都发生在一个应用程序上。 在本地执行应用程序没有问题。 重新启动后,它又开始工作了 – 引发的SEHException是构造函数init和TargetInvocationException