2011-03-18 29 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服務中,該服務只允許一個線程訪問該庫,有史以來