2011-03-18 70 views
4

我有一个asp.net(3.5)web应用程序。 在一个页面中,我使用了一个非托管C库(一个模拟器),它根据一些输入生成一组结果。奇怪的问题System.AccessViolationException

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

由于错误的性质,我将呼叫放入try-catch以记录异常,然后不会出现异常!

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

+0

这真的很奇怪。不是我迷信,而是过去奇怪的事情发生在我身上。这就是为什么我远离Web编程的原因...... AccessViolationException可能是由于您的应用程序没有权限使用的磁盘访问或其他资源访问。它在您调试时可能是因为它在调试期间分配了更多的权限。也许作为用户,您可以授予更多权限给应用程序,但匿名用户没有太多权限,因此失败。 – 2011-03-18 15:48:24

+0

你知道哪行代码会抛出异常吗?还是它出现在哪里?后者通常是与框架相关的问题引起的,并且通常在加载过程中发生,至少对我而言。您的模拟器DLL可能不在具有权限的文件夹中,或者模拟器在加载过程中尝试在没有权限的情况下读取/写入。 – 2011-03-18 15:53:05

+0

以及我不知道C应用程序内的代码行。它在内存操作中使用,并使用应用程序有权访问的领域内存在的小文件(App_Data)。如果只是调试模式问题,我会认为它是与权限相关的,但try-catch现象使我认为这是与框架有关的 – Jaguar 2011-03-18 17:16:16

回答

3

AccessViolationException在这种情况下可能意味着你的非托管C代码搞砸了。它覆盖堆或什么。

请记住,许多代码片段从未写入像在ASP.NET中一样的多线程环境中运行。他们从来没有在这样的环境中进行过测试,或者仅使用某些不适用于ASP.NET的“桌面”形式的多线程进行测试。

我曾经有过这样的问题。声称是线程安全的第三方DLL非常不安全。通过将一个非托管调试器附加到ASP.NET工作进程,有可能看到应用程序正在遍布C运行时库堆,而堆却怨声载道。没有人听到投诉。

有必要在lock块中包装对此代码的调用 - 以确保一次只有一个线程可以调用它。这足以防止所有的崩溃,即使在负载下。

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