2009-04-23 2 views
0

Я отладки программного обеспечения, которое в конечном итоге происходит сбой с одним из следующих сообщений:отладка проблема распределения памяти 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, я только что получил диалог окна прошу меня отправить отчет об ошибке.

Что мне не хватает?

ответ

1

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

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

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

+0

Я пытаюсь использовать это для отладки примера, который я создал. Удалось перейти к шагу 5 (перезагрузить файл PDB), затем нажмите f5. Вот когда я получаю две ошибки: поврежденный шаблон суффикса и поврежденный блок кучи, но я не могу понять, как и почему это произошло ... – Rodrigo

+0

Вы можете попробовать, запустив exe с прикрепленным отладчиком. Этого можно достичь с помощью gflags.exe. Когда вы запустите gflags.exe, вкладка «Файл изображения» 1.Goto 2) Дайте полный путь к вашему exe в текстовом поле изображения. 3) нажмите Tab, чтобы включить 4) Дайте полный путь к windbg -g в текстовом поле Debugger. –

+0

Я попытался открыть gflags.exe, перейдя к файлам изображений, выбрал мой exe и выбрал вариант отладки, заполняющий его C: \ DebugTools \ windbg.exe -g. Затем я попытался нажать «ОК», но ничего не произошло. Затем я нажал кнопку запуска, но отладки не было показано. – Rodrigo

0

Перед использованием gFlags/PageHeap Я предлагаю вам проверить исключение нарушения доступа. Сначала подключите этот процесс, используя команду «Создать» - «Запуск отладки-> Прикрепить к процессу». Когда он подключен, включите исключение нарушения доступа, выбрав «Отладка-> Исключения», выберите «Нарушение доступа» и установите флажок «Стоп всегда». Затем проверьте, что ваш отладчик ловит исключения для нарушения доступа.

+0

Для настоящей программы (а не тестовой), она обнаружила некоторые исключения относительно компонента CTreeView, но я не думаю, что это источник моих проблем. Когда я попробовал это с помощью своей тестовой программы, он ничего не поймал и разбился, как обычно, с той же ошибкой. – Rodrigo

Смежные вопросы