Точка останова пользователя из ниоткуда - PullRequest
7 голосов
/ 22 декабря 2008

У меня есть некоторый код в MS VC ++ 6.0, который я отлаживаю. По какой-то причине, в этот определенный момент, когда я пытаюсь удалить некоторую динамически распределенную память, она ломается, и я получаю всплывающее окно с сообщением «Точка останова пользователя вызывается из кода в бла-бла-бла»…, затем появляется окно «Разборка», и я см

*memory address* int      3

Странно то, что в коде, который я называю инструкцией по сборке, есть НИЧЕЕ (например, asm int 3 - команда аппаратного прерывания для x86?) ..

что может быть причиной этого?

РЕДАКТИРОВАТЬ: ОТВЕТ: Мой код "уходил с конца" массива, но только в местах, отмеченных отладкой Visual Studio с 0xFDFDFDFD, который называется забором NoMan'sLand. Я думаю, что его также называют Off -по одной ошибке .. Этот массив не был связан с той точкой, где я освобождаю память, когда произошла ошибка. Что затруднило поиск ..: (

Ответы [ 2 ]

8 голосов
/ 22 декабря 2008

Вы, вероятно, нажали код в подпрограммах отладки кучи, которые обнаружили повреждение кучи.

Как выглядит стек вызовов, когда вы нажали Int 3?

Редактировать: Основываясь на трассировке стека в ваших комментариях, подпрограмма _CrtIsValidHeapPointer() говорит, что освобождаемый указатель плохой. Вот фрагмент кода из источника MSVC 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 будет значением указателя, который вы удаляете.

3 голосов
/ 22 декабря 2008

(я думаю, что asm int 3 - аппаратный сбой команда для x86?

Это. Это называется "аппаратная точка останова" . Если вы используете отладчик VS с исходным кодом проекта, это похоже на точку останова (но в коде). Начиная с 2005 года, если ваше приложение запускается без какого-либо отладчика, оно просто аварийно завершает работу, как если бы оно запускало неуправляемое исключение.

Во многих компаниях существует простой макрос, используемый для добавления этой точки останова в код. Это может заменить утверждения и исключения в некоторых (жестких и редких) случаях:

#define BREAKPOINT __asm { int 3; }

BREAKPOINT;

См .:

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

...