Dot-Net

如何調試“安全句柄已關閉”錯誤

  • June 1, 2016

我繼承的程式碼不斷崩潰,並出現以下錯誤(根本沒有改變):

System.ObjectDisposedException: Safe handle has been closed
  at Microsoft.Win32.UnsafeNativeMethods.GetOverlappedResult(
         SafeFileHandle hFile, NativeOverlapped* lpOverlapped, 
         Int32& lpNumberOfBytesTransferred, Boolean bWait)
  at System.IO.Ports.SerialStream.EventLoopRunner.WaitForCommEvent()
  at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
  at System.Threading.ExecutionContext.runTryCode(Object userData)
  at System.Runtime.CompilerServices.RuntimeHelpers.
         ExecuteCodeWithGuaranteedCleanup(
         TryCode code, CleanupCode backoutCode, Object userData)
  at System.Threading.ExecutionContext.RunInternal(
         ExecutionContext executionContext, ContextCallback callback, 
         Object state)
  at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, 
         ContextCallback callback, Object state)
  at System.Threading.ThreadHelper.ThreadStart()

這只是在以前的開發人員添加AppDomain.UnhandledException Event時才被擷取。

如果我刪除它,應用程序只會崩潰並顯示 Dr Watson 消息(發送回饋等),而不是通常的 .NET 對話框(使用 continue 選項和堆棧跟踪)。

我已經檢查過,它與Thread.Abort無關

我如何嘗試從堆棧跟踪中找到此問題的原因,而不是在應用程序的程式碼中?

從 System.IO.Ports.SerialStream.EventLoopRunner.WaitForCommEvent() 和 Microsoft.Win32.UnsafeNativeMethods 的事實來看,我會冒著風險,您有一個 COM 組件,該組件具有內部執行緒訪問埠,例如串列或 TCP/IP 數據.

看起來執行緒在其啟動序列期間拋出異常。可能它正在嘗試訪問不可用或不存在的埠。這失敗了,異常沒有被處理,因此通過程式碼傳播回來。

嘗試從 UnhandledException 事件中記錄更多資訊,以便了解這可能從哪裡開始。

引用自:https://stackoverflow.com/questions/1625081