系统.AccessViolationException出现奇怪的问题

4
我有一个asp.net (3.5)的Web应用程序。其中一个页面使用一个非托管的C库(模拟器),基于某些输入产生一组结果。
当我在web.config中设置debug="false"(发行版),调用会导致System.AccessViolationException异常。如果我在调试器中,或者至少在web.config中设置debug="true",这个异常就永远不会出现。
由于bug的性质,我将调用放在了try-catch中来记录异常,然后异常就不会出现了!
是否存在一些神奇的受保护内存空间处理方式,在调试模式和/或try-catch中?

这真的很奇怪。虽然我不迷信,但过去发生过一些奇怪的事情。这就是为什么我远离网络编程的原因... AccessViolationException可能是由于磁盘访问或其他资源访问导致的,而您的应用程序没有使用权限。在调试时它可以工作,也许是因为在调试期间分配了更多的权限。也许作为用户,您能够授予应用程序更多的权限,但匿名用户没有那么多的权限,所以它会失败。 - Eugenio De Hoyos
你知道是哪一行代码抛出了异常吗?还是它突然出现的?后者通常是由框架相关问题引起的,而且通常发生在加载过程中,至少对我来说是这样。你的模拟器dll可能没有在具有权限的文件夹中,或者在加载过程中模拟器尝试进行读/写操作而没有权限。 - Eugenio De Hoyos
我不知道C应用程序中的代码行。它执行内存操作并使用存在于应用程序具有访问权限的领域内的小文件(App_Data)。如果仅是调试模式问题,我会考虑它与权限相关,但try-catch现象使我认为这是框架相关的。 - Jaguar
你在 catch 块里做什么?你的应用程序的身份验证模式是什么? - matt-dot-net
这个catch块除了使用log4net记录异常日志以外,什么也不做。我正在使用Windows身份验证。 - Jaguar
1个回答

3
在这种情况下,AccessViolationException 可能意味着您的非托管 C 代码出了问题。它正在覆盖堆栈或其他内容。
请记住,许多代码都不是为像 ASP.NET 这样的多线程环境编写的。它们甚至从未在这样的环境中进行过测试,或者仅使用某些“桌面”形式的多线程进行了测试,而这并不适用于 ASP.NET。
我曾经遇到过类似的问题。一个声称是线程安全的第三方 DLL 却非常不安全。通过将非托管调试器附加到 ASP.NET 工作进程,可以看到应用程序正在在 C 运行时库堆栈上写入所有内容,并且堆栈正在对此抱怨。但却没有人听取这些抱怨。
必须将对此代码的调用包装在 lock 块中,以确保只有一个线程可以同时调用它。这足以防止所有崩溃,即使在负载下也是如此。
这仍然可能不足以满足所有非托管代码的要求。假设一段代码假定所有调用都将在同一线程上发生,或者来自同一“会话”的所有调用都将在同一线程上发生,则会失望,并且可能会崩溃或执行更糟糕的操作。在这种情况下,您可能需要将该代码移动到一个单独的 Windows 服务中,该服务仅允许一个线程永远访问该库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接