Отладка проблем с выделением памяти в Visual C ++ - PullRequest
0 голосов
/ 23 апреля 2009

Я отлаживаю программное обеспечение, которое в итоге завершается с одним из следующих сообщений:

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 ]

1 голос
/ 23 апреля 2009

Вы можете запустить свое приложение в режиме релиза, установив Windbg .

  • Включить gflags (Как вы упоминается)
  • Запустите приложение в выпуске режим.
  • Присоедините его к Windbg, используя опцию Attach to process в Windbg.
  • Настройка правильного пути для освободить PDB.
  • Перезагрузите PDB вручную, используя .reload /f в случае автоматического загрузка не удалась.
  • Выполните вариант использования.

WinDbg останавливает выполнение при возникновении исключения. Для каждого первого случайного исключения проанализируйте причины. Это может быть одна из ошибок для сбоя.

0 голосов
/ 23 апреля 2009

Перед использованием gFlags / PageHeap я предлагаю вам проверить исключение Access Violation. Сначала присоедините процесс, используя Build-> Start Debug-> Attach to process. После того, как оно присоединено, включите исключение нарушения прав доступа, перейдя в Debug-> Exceptions, выберите Access Violation и установите флажок Stop Always. Затем проверьте, перехватывает ли ваш отладчик какие-либо исключения нарушения прав доступа.

...