#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()
.