Вопрос

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

Видишь :

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top