Инструмент для наглядной визуализации структуры памяти C-программы - PullRequest
8 голосов
/ 22 апреля 2011

Предположим, у меня есть этот код:

int main() {
    int var1;  
    char *ptr = malloc(5 * sizeof(char));  
    //...........  
    do_something();  
    //...........    
    return 0;  
}

Мы знаем, что фактическое расположение памяти будет разделено на сегменты, такие как: .text, .bss, .data, .heap, .stack.

Я знаю, как использовать objdump, readelf и т. Д. Но я хочу получить лучшее представление о стеке памяти, где я могу видеть такие вещи, как:

.heap       ptr  
.stack      do_something()  
.text       main()  
.bss        var1  

Главное в этом: фактические имена переменных отсутствуют в выходных данных objdump, readelf и т. Д.

Я компилирую этот код с помощью -g, таким образом, сохраняя таблицу символов.

Тогда, почему я не могу видеть структуру памяти с включенными локальными / глобальными именами переменных?

objdump -x показывает имена переменных, если тип static, иначе нет.Почему?

Ответы [ 2 ]

2 голосов
/ 22 апреля 2011

Извините, что вы немного смущены этим. Рассмотрим:

  • все ваши функции находятся в разделе .text
  • все ваши нестатические локальные переменные в стеке: они могут быть указателями, и вы намереваетесь присвоить им значение, возвращаемое из malloc, не помещает их в кучу, а просто пытается создать объект, на который указывают в кучу. Ни один статический инструмент, который просматривает двоичный файл (например, objdump, readelf), не может знать, будет ли malloc возвращать память или произойдет сбой.
  • Ваши глобальные и static переменные, вероятно, окажутся в инициализированном или неинициализированном сегменте данных - это зависит от того, является ли начальный битовый шаблон полностью нулевым, и может ли компилятор убедиться в этом во время компиляции.

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

1 голос
/ 09 апреля 2017

Существует несколько методов отслеживания распределения памяти, но ни один из них не является встроенным, и все они требуют дополнительной работы на вашей стороне.Чтобы визуализировать память, вам придется использовать инструментарий кода и / или протоколирование событий, то есть события выделения и освобождения памяти, а затем воспроизвести все события и сгенерировать из них графики.

Посмотрите на эту статью: Визуализация динамического выделения памяти (в программах на C) .

GCSpy (для визуализации кучи) доступен здесь: https://www.cs.kent.ac.uk/projects/gc/gcspy/. При первоначальном использовании для JVM вы можете визуализировать кучупрограмма на C, использующая, например, dlmalloc.

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

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

...