перебрать все фрагменты на всех аренах в glibc malloc - PullRequest
3 голосов
/ 17 ноября 2011

Может кто-нибудь, кто имеет какое-то базовое представление о коде glibc malloc, расскажите, пожалуйста, как я могу перебрать все арены и выяснить, какие чанки не освобождаются, т. Е. Установлен их начальный бит. Это я должен сделать во время выхода из процесса.

или

более детерминистически, если у нас есть арена, можем ли мы получить доступ к первому выделенному в ней чанку?


спасибо всем, что нашли время и ответили. Я разместил этот вопрос довольно давно. У «Phrack» есть некоторые методы взлома, перечисленные в этих выпусках. Мне это помогло.

С уважением, Капил

Ответы [ 3 ]

5 голосов
/ 13 апреля 2012

Все основные профилировщики кода c обычно имеют какую-то оболочку для malloc для отслеживания памяти.Вам, вероятно, придется сделать то же самое, если не что-то похожее для отслеживания памяти и ее независимости от платформы.

Вот несколько примеров:

отслеживание того, сколько памяти выделено malloc

Простая реализация C для отслеживания памяти malloc / free?

Вам нужно будет добавить дополнительные структуры для хранения выделенных ссылок на память, чтобы вы могли вернуться и выполнить итерациюНад ними.Я полагаю, что вы захотите ознакомиться с алгоритмами очистки памяти.Mark N Sweep и Reference-Counting являются наиболее популярными алгоритмами, используемыми сегодня.JVM использует Mark N Sweep.Вам также придется исследовать сценарии сильных и слабых связей и то, как они могут применяться к вашему ГХ.

В противном случае, если вы хотите сэкономить время и не писать свою собственную оболочку, можно использовать такие инструменты, как valgrind и gprof, чтобыпрофиль и оцените использование памяти.

Честно говоря, я бы проверил Boehm-Demers-Weiser Garbage Collecter .Это уже написано и основано на обширных исследованиях.

Только что заметил, что BDWGC перешел на GitHub .

1 голос
/ 10 апреля 2012

Судя по формулировке этого вопроса, вы пытаетесь заново изобрести алгоритм, похожий на mark-sweep для сборки мусора с использованием glibc .Усилия благородны, но сборщики мусора существуют , чтобы удовлетворить эту потребность достаточно аккуратно, и обращение к ним сэкономит вам огромное количество усилий по повторной реализации, если это действительно ваша конечная цель.

Между темтребуемая вам функциональность не существует в спецификации C , и ее реализация в glibc довольно сложна и неуместна .Вам следует обратиться к версии malloc/malloc.c вашего локального glibc, чтобы определить правильную стратегию, если вы хотите продолжать двигаться вперед в реализации, из-за разных версий, обеспечивающих очень разные гарантии уровня распределителя.Это может быть сделано путем совмещения кода на распределителе, но это, кажется, не идеальное решение вашей проблемы.

Несмотря на то, что он погружен в C ++, этот поток содержит сокровищекуча информации о том, как написать свой собственный менеджер памяти и как оценить хорошую эталонную реализацию, которая является более работоспособной стратегией, если вы не хотите привязывать себя к внутренним компонентам glibc.Я очень рекомендую эту стратегию, потому что она защищает ваше приложение в будущем и абстрагирует желаемую функциональность (таким образом, вы можете в будущем добавить другую библиотеку C).

Удачи в вашем приложении (с).

0 голосов
/ 20 декабря 2012

Вот бумага BlackHat с хорошим описанием внутренних структур glibc, используемых для выделения кучи памяти.
arena.c и malloc.c источники - это еще одно место, на которое стоит обратить внимание.

В коде main_arena global - это корень. main_arena.next указывает на следующую арену (если есть), main_arena.bins описывает ячейки с частями памяти.

...