none
請教關於 AccessViolationException ... RRS feed

  • 問題

  • 小弟參考一些資料,寫了一組伺服器連線軟體(有點像MSN),但執行時只要其中一端失去連線,另一端立刻會出現 AccessViolationException 例外,然後程式就死當了,最底下是這個例外的相關資料..

    請問小弟該如何避開這個例外錯誤呢??(或是乾脆不要讓它出現....)

    嘗試許多方法來抓這個例外,可是卻抓不到,曾經以這個標題搜尋其他文章,也找不到解決方法@@
    查其他地方似乎是提到可用hot fix 928023解決,但小弟找不到...@@

    第一次寫多執行緒的app,就碰到一卡車問題....好慘@@

    小弟功力太淺...懇求各位先進解答...@@


    System.AccessViolationException 未處理
      Message="嘗試讀取或寫入受保護的記憶體。這通常表示其他記憶體已損毀。"
      Source="System"
      StackTrace:
           於 System.Net.UnsafeNclNativeMethods.OSSOCK.WSAGetOverlappedResult(SafeCloseSocket socketHandle, IntPtr overlapped, UInt32& bytesTransferred, Boolean wait, IntPtr ignored)
           於 System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
           於 System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)

    2007年1月3日 下午 12:43

解答

  • AccessViolationException 是一種作業系統層級的嚴重例外狀況,因為侵犯到了其他行程的記憶體,所以程式必須強制關閉,不管你怎麼用 try/catch 都抓不到的。

    以下為 AccessViolationException 的說明:

    當程式碼嘗試讀取或寫入尚未配置或其不具存取權的記憶體時,Unmanaged 或 Unsafe 程式碼會發生存取違規。原因通常是指標有錯誤值。並非所有透過錯誤指標讀取或寫入的動作都會導致存取違規,因此存取違規通常指出已透過錯誤指標執行多次讀取或寫入,且該記憶體可能已毀損。因此,存取違規幾乎都會指出嚴重的程式設計錯誤。在 .NET Framework 2.0 版中,AccessViolationException 會明確地辨識這些嚴重錯誤。

    在完全由可驗證 Managed 程式碼組成的程式中,所有參考不是有效就是 null,且不可能發生存取違規。只有當可驗證 Managed 程式碼與 Unmanaged 程式碼或 Unsafe Managed 程式碼互動時,才會發生 AccessViolationException

    我想你可能用到了 P/Invoke 呼叫 Win32 API 吧,你可以把這些程式碼檢查一下,然後檢查你的多緒處理的程式碼。
    如果沒特別必要,網路通訊用 System.Net.Sockets 的類別實作應該就足夠了。

    2007年1月4日 上午 01:54
    版主