Visual C ++: неверный размер размещения. Как заставить отладчик остановиться на этом сообщении? - PullRequest
3 голосов
/ 03 июня 2010

Программа MFC, которую я отлаживаю, печатает это сообщение в окне «Вывод» в Visual Studio 9.0:

HEAP[AppName.exe]: Invalid allocation size - 99999998 (exceeded 7ffdefff)

Я почти уверен, что это из-за неверной "новой", неинициализированной переменной или аналогичной ошибки.

Вопрос: как заставить отладчик остановиться на этом сообщении, чтобы я мог просмотреть трассировку стека и решить проблему?


Редактировать: Следующие фрагменты не выдают того же предупреждения. Вместо этого они генерируют сообщение в стиле Invalid allocation size: 4294967295 bytes..

int stupid = -1;
char *bob = new char[stupid];

И

malloc(-1);

Итак, я подозреваю, что это происходит из системной DLL с собственным управлением памятью или использует другой API.

Ответы [ 4 ]

4 голосов
/ 12 июня 2010

Сообщение об ошибке, вероятно, исходит от HeapAlloc() в ntdll.dll.

Я могу воспроизвести сообщение со следующим кодом:

HANDLE hHeap = HeapCreate(0, 0, 4096);
LPVOID p = HeapAlloc(hHeap, 0, 0x99999998);

Сообщение отправляется в окно вывода отладчика с помощью DbgPrint() в ntdll.dll, поэтому я бы попытался установить там точку останова (это экспортируемая функция, поэтому вам не понадобится файл символов, чтобы найти ее адрес) и затем, глядя на ваш стек вызовов.

1 голос
/ 10 июня 2010

Это сообщение об ошибке выводится в строке 409 файла dbgheap.c, который находится в Program Files \ Microsoft Visual Studio 9.0 \ VC \ crt \ src. Вы должны просто установить точку останова.

0 голосов
/ 10 июня 2010

Вы знаете, где находится эта функция или как она называется? Grep источники времени выполнения для строк в сообщении об ошибке. Попробуйте установить точку останова для вызова функции или файла / местоположения в диалоге Отладка-> Новая точка останова.

Если это не сработает, вы можете отключить большую пушку (но это болезненно и отнимает много времени) и изменить файл, в котором реализована функция (если он находится в заголовке - если он находится в файле .cpp) это еще больше работы). Добавьте это:

__asm {
    int 3;
}

чтобы вручную вставить код операции 'break to debugger'. Это прием, который я часто использую, чтобы принудительно установить точку останова в DLL, для которой отладчик не может правильно определить местоположение для точки останова.

0 голосов
/ 03 июня 2010

Попробуйте это:

В строке меню перейдите к Debug -> Exceptions. Добавьте C++-Exception с именем std::bad_alloc и установите флажок Thrown, чтобы остановить место, где было сгенерировано исключение.

...