Есть ли команда, которую я могу вызвать, чтобы распечатать структуры данных malloc? - PullRequest
3 голосов
/ 11 декабря 2010

Привет, интересно, есть ли какая-нибудь готовая функция, которую я могу вызвать для печати всех структур данных malloc, чтобы я мог видеть, какая память выделена для какой переменной?

У меня такое повреждение памяти, что когда я освобождаю одну переменную, она жалуется, но я понятия не имею, какая переменная смежна с ней.

Спасибо!

Ответы [ 4 ]

3 голосов
/ 11 декабря 2010

Попробуйте запустить вашу программу под valgrind. Если вам повезет, это укажет вам прямо на оскорбительную запись памяти. (Если вам не повезет, вы просто получите множество ложных жалоб на код глубоко в библиотеке C.)

0 голосов
/ 09 июля 2011

Наш CheckPointer инструмент, скорее всего, может найти точное место, где вы повредили память.

Большинство инструментов для проверки памяти имеют какие-то "ограждения" вокруг ваших данных, чтобы обнаружить плохой доступ. Такие заборы имеют значительно больший размер, чем ограждаемый объект; если вы получаете доступ снаружи объекта, но внутри забора, ошибка не обнаружена. Например, Valgrind не имеет ни малейшего представления о фреймах стека, поэтому не может обнаружить доступ к фрейму стека, который вышел из области видимости и был перезаписан другим. CheckPointer может .

CheckPointer отслеживает точное распределение каждого блока хранилища (кучи, стека, части структуры) и каждого доступа. Он точно знает, когда вы вышли за пределы точного пространства, отведенного для объекта хранения (например, если вы достигли конца массива, встроенного в середину структуры). Таким образом, он может обеспечить намного лучшую проверку.

CheckPointer также предоставит дамп после выполнения всего выделенного хранилища; конечно, вы можете вызвать эту процедуру дампа в произвольном месте в вашем коде в качестве средства отладки.

0 голосов
/ 27 декабря 2010

Я не знаю ни одной функции, которую можно вызвать из вашей программы, но вы можете сделать это с помощью отладчика. Попробуйте https://github.com/cloudburst/libheap или под Win32 в windbg используйте команду '! Heap'.

0 голосов
/ 11 декабря 2010

Я думаю, что было бы чрезвычайно трудно понять, как вы это описываете, поскольку в памяти нет ничего, что указывало бы на переменные-владельцы.

Теоретически вы можете пройти по всему дереву всех объектов, созданных вашим приложением, пока не найдете указатель, указывающий на память, рядом с местом, вызывающим проблемы.

Вы можете использовать такой инструмент, как gdb, чтобы выгрузить кусок памяти вокруг вашего распределения и убедиться в этом. Возможно, вы узнаете данные, посмотрев на них, и это укажет на код, который вызывает проблемы.

Лучше всего было бы использовать такой инструмент, как электрический забор, который мгновенно убивал бы ваше приложение, когда ваш код пытается повредить память.

...