如何调试“安全句柄已关闭”错误

时间:2009-10-26 14:18:04

标签: .net debugging exception

我继承的代码因以下错误(完全没有改变)而非常强大地崩溃:

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

无关

如何从堆栈跟踪中找到问题的原因,而不是在应用程序的代码中?

1 个答案:

答案 0 :(得分:9)

从引用System.IO.Ports.SerialStream.EventLoopRunner.WaitForCommEvent()和Microsoft.Win32.UnsafeNativeMethods的事实来看,我会冒一个COM组件,它有内部线程访问端口,例如用于串行或TCP / IP数据。

看起来线程在它的启动序列期间抛出异常。可能是它正在尝试访问不可用或不可用的端口。这失败了,并且没有处理异常,因此通过代码传播回来。

尝试从UnhandledException事件中记录更多信息,以便了解这可能从何处开始。