Точка останова пользователя из ниоткуда

У меня есть код в 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;

Увидеть:

Поэтому я предлагаю поискать какой-нибудь макрос или объект, делающий это, или, может быть, он добавлен в модуль (dll/lib), код которого у вас нет?

Другие вопросы по тегам