Пользовательская точка останова из ниоткуда
-
23-08-2019 - |
Вопрос
У меня есть некоторый код в MS VC ++ 6.0, который я отлаживаю.По какой-то причине в этот определенный момент, когда я пытаюсь удалить некоторую динамически выделяемую память, она прерывается, и я получаю всплывающее окно с сообщением "Пользовательская точка останова вызвана из кода в бла-бла-бла"..затем всплывает окно разборки, и я вижу
*memory address* int 3
Странно то, что НИГДЕ в коде, который я вызываю, нет инструкции по сборке, подобной этой (я думаю, asm int 3 - это команда аппаратного прерывания для x86?)..
что может быть причиной этого?
Редактировать:ОТВЕТ:Мой код "отходил от конца" массива, но только в местах, отмеченных Visual Studio debug с помощью 0XFDFDFDFDD, который называется забором Номана..Я думаю, что это также называется одноразовой ошибкой..Этот массив не был связан с тем моментом, когда я освобождал память при возникновении ошибки.Что затрудняло его обнаружение..:(
Решение
Вероятно, вы сталкиваетесь с кодом в процедурах отладки кучи, которые обнаружили повреждение кучи.
Как выглядит стек вызовов, когда вы нажимаете на Int 3?
Редактировать:Основываясь на трассировке стека в ваших комментариях, процедура _CrtIsValidHeapPointer()
говорит о том, что освобождаемый указатель - это плохо.Вот фрагмент кода из DBGHEAP MSVC.Исходный код на C:
/*
* If this ASSERT fails, a bad pointer has been passed in. It may be
* totally bogus, or it may have been allocated from another heap.
* The pointer MUST come from the 'local' heap.
*/
_ASSERTE(_CrtIsValidHeapPointer(pUserData));
pUserData
было бы значением указателя, который вы удаляете.
Другие советы
(Я думаю, что asm int 3 - это аппаратный сбой команда для x86?
Так и есть. Это называется "аппаратная точка останова".Если вы используете отладчик VS с исходным кодом проекта, это похоже на точку останова (но в коде).Начиная с vs2005, если ваше приложение запускается без какого-либо отладчика, приложение просто аварийно завершит работу, например, если оно запустило неуправляемое исключение.
Во многих компаниях есть простой макрос, используемый для добавления этой точки останова в код.Это может заменить утверждения и исключения в некоторых (сложных и редких) случаях :
#define BREAKPOINT __asm { int 3; }
BREAKPOINT;
Видишь :
- http://msdn.microsoft.com/en-us/library/45yd4tzz (ПРОТИВ 80).aspx
- http://www.highprogrammer.com/alan/windev/visualstudio.html
Поэтому я предлагаю поискать какой-нибудь макрос или объект, выполняющий это, или, может быть, он добавляется в модуль (dll / lib), кода которого у вас нет?