недопустимое исключение дескриптора при отладке

#c #visual-studio #debugging #exception

#c #visual-studio #отладка #исключение

Вопрос:

У меня есть следующее сообщение, когда я нахожусь в режиме отладки в Visual studio 2010 Unhandled exception at 0x76c5f9e2 in test.exe: 0xC0000008: An invalid handle was specified. , когда я запускаю это в обычном режиме, я не получаю эту ошибку. Отладчик останавливается в close.c в этой строке

 CloseHandle( (HANDLE)_get_osfhandle(fh) ) )
  

Есть ли у кого-нибудь предложения, как можно избежать такой ошибки?

Комментарии:

1. Почему вы все равно это делаете? CRT закрывает дескриптор при вызове _close() . Если вы тоже закроете его, дескриптор будет дважды закрыт, и, следовательно, у вас будет invalid handle ошибка.

2. но почему эта ошибка возникает только тогда, когда я в режиме отладки?

3. Это один из случаев, когда операционная система изменяет свое поведение в зависимости от того, выполняется ли отладка или нет.

4. @RaymondChen и др.: вы случайно не знаете, есть ли способ отключить эту дополнительную проверку ошибок при отладке? Я использую дерьмовую библиотеку, которую я не могу легко изменить или перестроить, что выдает мне ту же ошибку (но все еще «работает», когда она не запускается в отладчике), и пока отладчик зависает на этой конкретной ошибке, практически невозможно отлаживать что-либо еще .

5. Вы можете просто указать своему отладчику игнорировать исключение.

Ответ №1:

Не обрабатывайте это исключение, но избегайте ситуации, когда вы передаете недопустимый дескриптор!

Редактировать:
В режиме отладки код дает вам подсказку, что что-то не так. Поэтому вы должны исправить эту ошибку, а не обрабатывать послесловия исключения!

Комментарии:

1. Поскольку отладчик указывает на ошибку, я бы просто отладил это место. Посмотрите на callstack и посмотрите, почему это происходит. Если вам повезет, это логическая ошибка… если это проблема, связанная с многопоточностью, тогда: удачи

Ответ №2:

У меня только что была такая же проблема.

Я проверил повреждение стека, повреждение дескриптора и т.д. В конце концов я обнаружил, что мне не следовало звонить CloseHandle() !

Это был дескриптор, возвращенный FindFirstFile() , правильная функция удаления FindClose() , нет CloseHandle() .