2016-01-30 3 views
2

Я ищу стратегию отладки памяти в C++. Я написал приложение, использующее QT. Я использую Windows 7. Используемый компилятор - MinGW. В режиме отладки, я иногда получаю следующее сообщение отладки: КУЧИ КОРРУПЦИИ ОБНАРУЖЕН: после того, как нормальный блок (# ...) в 0x ...Стратегия отладки памяти

Я думаю, происходит следующее: Блок памяти освобождаются с помощью удаления , После этого используется память.

В большинстве случаев это будет работать без проблем. Но иногда это приводит к сбою приложения. Мой вопрос в том, как отладить эту ошибку? Я думаю о замене оператора new/delete.

Рассмотрим следующий новый/удалить оператор:

struct MemHandle 
{ 
    void* ptr; 
    size_t size; 
} 

void * operator new(std::size_t n) throw(std::bad_alloc) 
{ 
    MemHandle Mem; 
    void* p = malloc(n); 
    Mem.ptr = p; 
    Mem.size = n; 
    //TODO: Store Mem 
} 
void operator delete(void * p) throw() 
{ 
    MemHandle Mem = GetMemHandle(p); 
    memset(p, 0, Mem.size); 
    free(p); 
} 

В этом случае, когда память повторно после удаления, программа немедленно рухнет. Это хорошая стратегия, или у вас есть лучший вариант?

+0

Возможный дубликат [Как отлаживать ошибки кучи коррупции?] (Http://stackoverflow.com/questions/1010106/how-to-debug-heap-corruption-errors) – user1641854

ответ

2

То, что вы пытаетесь достичь, - это ведение бухгалтерского учета для каждого распределения памяти. Имеются инструменты профилирования памяти (как коммерческие, так и с открытым исходным кодом), которые делают то же самое.
Valgrind - отличный, но он недоступен в Windows.
Purify является коммерческим инструментом, который работает на окнах, и если вы ищете открытый источник один, чем есть Dr Memory
Вы можете изучить некоторые дополнительные инструменты here

+0

Я пробовал Dr Memory, но без каких-либо успехов , Программа продолжает сбой. – MvHorssen

0

Мой опыт говорит, что самый замечательный инструмент для проблем с памятью отладки это дезинфицирующие средства для памяти (как GCC, так и LLVM поддерживает их, -fsanitize-memory). Это довольно быстро, легко использовать, и я был в ситуациях, когда valgrind ничего не видит, но дезинфицирующие средства. Дезинфицирующее устройство для памяти будет SIGABORT при обнаружении проблемы с памятью, поэтому трассировка стека сразу будет у вас на глазах. Некоторые из недостатков санитаров - увеличение использования кучи и немного сложный процесс сборки, но обычно это не проблема.

+0

Поскольку GCC поддерживает его, он также должен быть доступен в MinGW, не так ли? – MvHorssen

+0

Ну, должно быть. Но быстрый поиск показывает, что, по крайней мере, в середине 2015 года MinGW не поддержал его. Но вы можете попытаться использовать clang. – user1641854

+0

В любом случае, если ваше приложение переносимо или вы можете переносить подозрительную часть кода в Linux, вы можете использовать GCC или Clang с дезинфицирующим устройством для адресов. – user1641854