【问题标题】:invalid handle exception when debugging调试时无效句柄异常
【发布时间】:2011-12-07 16:40:01
【问题描述】:

我在 Visual Studio 2010 中处于调试模式时收到以下消息Unhandled exception at 0x76c5f9e2 in test.exe: 0xC0000008: An invalid handle was specified.当我在常规模式下运行时,我没有收到此错误。 调试器在此行的 close.c 中停止

CloseHandle( (HANDLE)_get_osfhandle(fh) ) )

有没有人建议如何避免这种错误?

【问题讨论】:

  • 你为什么要这样做?当您调用_close() 时,CRT 会关闭句柄。如果你也关闭它,那么句柄就会双关,因此你有invalid handle 错误。
  • 但是为什么只有在调试模式下才会出现这个错误?
  • 这是操作系统根据您是否在调试而改变其行为的情况之一。
  • @RaymondChen 等人:您是否碰巧知道是否有办法在调试时禁用此额外的错误检查?我正在使用一个无法轻松修改或重建的糟糕库,这给了我同样的错误(但当它不在调试器中运行时仍然“有效”),并且只要调试器挂断了这个特定的错误,它几乎不可能调试任何东西else
  • 你可以告诉你的调试器忽略异常。

标签: c++ visual-studio debugging exception


【解决方案1】:

我也遇到了同样的问题。

我检查了堆栈损坏、句柄损坏等。最终我发现我不应该调用CloseHandle()

这是FindFirstFile()返回的句柄,正确的处理函数是FindClose(),而不是CloseHandle()

【讨论】:

    【解决方案2】:

    不要处理此异常,但要避免传递无效句柄的情况!

    编辑:
    在调试模式下,代码会提示您出现问题。所以你应该修复那个错误,而不是在后面处理异常!

    【讨论】:

    • 由于调试器指向错误,我将简单地调试这个地方。观察调用堆栈,看看为什么会这样。如果你很幸运,这是一个逻辑错误……如果是多线程相关问题,那么:祝你好运
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    相关资源
    最近更新 更多