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

11

我继承的代码经常崩溃,并且会出现以下错误(完全没有更改):

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事件所致。

如果我删除它,应用程序就会崩溃,并显示Dr Watson消息(发送反馈等...),而不是通常的.NET对话框(带有继续选项和堆栈跟踪)。

我已经检查过,与Thread.Abort无关。

如何尝试查找此问题的原因,因为从堆栈跟踪来看,它似乎不在应用程序的代码中?

1个回答

10

由于提到了System.IO.Ports.SerialStream.EventLoopRunner.WaitForCommEvent()和Microsoft.Win32.UnsafeNativeMethods,我猜测您可能有一个COM组件,其中包含内部线程来访问端口(例如串行或TCP/IP数据)。

这看起来像线程在启动序列期间抛出异常。可能是尝试访问不可用或不存在的端口,导致操作失败,异常未被处理,从而通过代码传播。

尝试记录更多信息,以便从UnhandledException事件中获得可能开始的位置的想法。


这个很好用。我除了鼠标之外,移除了所有连接的USB设备,然后它就可以工作了。不确定为什么会发生这种情况。 - Nitesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接