Отлаживать проблемы с выделением памяти Visual C ++

StackOverflow https://stackoverflow.com/questions/781821

  •  13-09-2019
  •  | 
  •  

Вопрос

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

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.Мы предполагаем, что это какое-то переполнение буфера, поэтому мы пытаемся найти способы определить, где это происходит.

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

Что я упускаю из виду?

Это было полезно?

Решение

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

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top