System.AccessViolationException的奇怪问题

时间:2011-03-18 15:12:37

标签: c# .net asp.net exception access-violation

我有一个asp.net(3.5)Web应用程序。 在一个页面中,我使用非托管C库(模拟器),它根据某些输入生成一组结果。

当我在web.config(发布模式)中设置debug="false"时,该调用将导致System.AccessViolationException。如果我在调试器中,或者至少在web.config中设置debug="true",则该异常将从不出现。

由于错误的性质,我将调用放在try-catch内以记录异常,然后异常没有出现!

在调试模式和/或try-catch中,是否对受保护的内存空间有一些神奇的工作?

1 个答案:

答案 0 :(得分:3)

在这种情况下,

AccessViolationException可能意味着你的非托管C代码搞砸了。它覆盖了堆或其他东西。

请记住,许多代码片段从未被编写为在类似ASP.NET的多线程环境中运行。它们甚至从未在这样的环境中进行过测试,或者仅使用一些不适用于ASP.NET的“桌面”形式的多线程进行测试。

我有一次像这样的问题。声称是线程安全的第三方DLL非常不安全。通过将非托管调试器附加到ASP.NET工作进程,可以看到应用程序正在整个C运行时库堆中编写,并且堆对此抱怨不已。没有人听到这些抱怨。

必须在lock块中包含对此代码的调用 - 以确保一次只能调用一个线程。这足以防止所有崩溃,即使在负载下也是如此。

这个仍然可能不适合所有非托管代码。假设所有调用都发生在同一个线程上的代码,或者来自同一个“会话”的所有调用都发生在同一个线程上的代码将会失望,并且可能会崩溃或做更糟糕的事情。在这种情况下,您可能需要将该代码移动到单独的Windows服务中,该服务只允许一个线程访问该库,永远