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

时间:2009-08-21 19:35:57

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

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

  

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

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

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

从堆栈跟踪中,实际错误是在构造一个不直接调用任何互操作代码的类时,但可能因为该对象可能是与DevExpress Grid数据绑定的列表的一部分而复杂化。 / p>

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

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

还有另外一条信息可能相关或不相关。同一程序的另一部分使用第三方组件,它实际上是本机dll周围的dotnet包装器,这个组件确实有一个已知的问题,偶尔会有一个

  

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

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

鉴于错误的后果很少(没有工作丢失并重新启动程序并返回到最多只需要一分钟的时间)并且考虑到客户将很快获得新版本(使用更新的第三方组件),我显然可以交叉,希望错误不会再发生。

但我还能做些什么吗?

8 个答案:

答案 0 :(得分:26)

是。此错误是未映射到.NET错误的结构化异常。可能是你的DataGrid映射抛出了未被捕获的本机异常。

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

答案 1 :(得分:6)

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

答案 2 :(得分:5)

如果你遇到这个帖子中描述的问题:

asp.net mvc debugger throwing SEHException

然后解决方案是:

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

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

答案 3 :(得分:3)

  

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

询问组件制造商如何测试客户所遇到的问题是否是他们说在最新版本中修复的问题,没有/在将最新版本部署到客户之前。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

答案 6 :(得分: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在没有机器管理权限的用户帐户下运行时,原生调用失败了。

答案 7 :(得分:0)

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