Отладка проблем с выделением памяти в Visual C++
Я отлаживаю программное обеспечение, которое в итоге вылетает с одним из следующих сообщений:
1. DAMAGE: after normal block (#24729280) at 0x00D710E0
2. Debug Assertion Failed
Program: D:\Soft\Test.exe
File: dbgheap.c
Line: 1017
Expression: _BLOCK_TYPE_IS_VALID(phead->nBlockUse)
Это программное обеспечение действительно старое, но менять его сейчас нельзя. Он написан на Visual C++ 6.0. Мы предполагаем, что это какое-то переполнение буфера, поэтому мы пытаемся найти способы обнаружить, где это происходит.
Я нашел информацию о PageHeap (которая, кажется, может сказать мне, что я хочу) и GFlags, но, похоже, я не могу заставить его работать.
Я создал тестовую программу:
char* test;
test = new char[5];
test[5] = 'a';
delete[] test;
что вызывает ошибку:
DAMAGE: after normal block (#55) at 0x1671920
Затем я попытался подключить к нему PageHeap, запустив:
gflags.exe /p /enable MemoryTest.exe /full
а затем перезапустить его (как через интерфейс Visual C++ 6.0, так и через проводник Windows), что привело к той же ошибке.
Затем я попытался скомпилировать версию выпуска и запустил ее через интерфейс Visual C++ 6.0, чтобы получить ошибку:
User breakpoint called from code at 0x7c90120e
А из проводника Windows я только что получил диалоговое окно Windows с просьбой отправить отчет об ошибке.
Что мне не хватает?
2 ответа
Вы можете запустить свое приложение в режиме релиза, подключившись к Windbg.
- Включить
gflags
(Как вы упомянули) - Запустите приложение в режиме релиза.
- Присоедините его к Windbg, используя
Attach to process
вариант в Windbg. - Настройте правильный путь для освобождения PDB.
- Перезагрузите PDB вручную, используя
.reload /f
в случае сбоя автоматической загрузки. - Выполните вариант использования.
WinDbg остановит выполнение при возникновении исключения. Для каждого первого случайного исключения проанализируйте причины. Это может быть одной из ошибок для сбоя.
Перед использованием gFlags/PageHeap я предлагаю вам проверить исключение Access Violation. Сначала присоедините процесс, используя Build->Start Debug->Attach to process. После того, как оно подключено, включите исключение нарушения прав доступа, перейдя в Debug->Exceptions, выберите Access Violation и установите флажок Stop Always. Затем проверьте, перехватывает ли ваш отладчик какие-либо исключения нарушения прав доступа.