Точка останова пользователя из ниоткуда
У меня есть код в MS VC++ 6.0, который я отлаживаю. По какой-то причине, в этот определенный момент, когда я пытаюсь удалить некоторую динамически распределенную память, она ломается, и я получаю всплывающее окно с сообщением "Точка останова пользователя вызывается из кода в бла-бла-бла"…, затем появляется окно "Разборка", и я увидеть
*memory address* int 3
Странно то, что в коде, который я называю инструкцией по сборке, есть НИЧЕГО (я думаю, что asm int 3 - это команда аппаратного прерывания для x86?)..
Что может быть причиной этого?
РЕДАКТИРОВАТЬ: ОТВЕТ: Мой код "уходил с конца" массива, но только в местах, отмеченных отладкой Visual Studio с 0xFDFDFDFD, которая называется забором NoMan'sLand. Я думаю, что его также называют Off-by- одна ошибка.. Этот массив не был связан с той точкой, где я освобождаю память, когда произошла ошибка. Что затруднило поиск..:(
2 ответа
Вы, вероятно, нажимаете код в подпрограммах отладки кучи, которые обнаружили повреждение кучи.
Как выглядит стек вызовов, когда вы попали в Int 3?
Изменить: на основе трассировки стека в ваших комментариях, рутина _CrtIsValidHeapPointer()
говорит, что освобождаемый указатель - это плохо. Вот фрагмент кода из источника MSGC DBGHEAP.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 с исходным кодом проекта, это похоже на точку останова (но в коде). Начиная с 2005 года, если ваше приложение запускается без какого-либо отладчика, оно просто рухнет, как если бы оно запустило неуправляемое исключение.
Во многих компаниях существует простой макрос, используемый для добавления этой точки останова в код. Это может заменить утверждения и исключения в некоторых (жестких и редких) случаях:
#define BREAKPOINT __asm { int 3; }
BREAKPOINT;
Увидеть:
- http://msdn.microsoft.com/en-us/library/45yd4tzz(VS.80).aspx
- http://www.highprogrammer.com/alan/windev/visualstudio.html
Поэтому я предлагаю поискать какой-нибудь макрос или объект, делающий это, или, может быть, он добавлен в модуль (dll/lib), код которого у вас нет?