Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
Мы нашли, что библиотека
dbug15.5.2. Отладчики выделения памяти
Игнорируя такие проблемы, как плохой дизайн программы, для любого крупномасштабного практического приложения единственной сложной задачей программиста на С является управление динамической памятью (посредством
malloc()realloc()free()Этот факт подкреплен большим количеством инструментов, доступных для отладки динамической памяти. Имеется значительное перекрывание того, что предлагают данные утилиты. Например:
• Обнаружение утечек памяти: память, которая выделяется, а затем становится недоступной.
• Обнаружение не освобождаемой памяти: память, которая выделяется, но никогда не освобождается. Не освобождаемая память не всегда является ошибкой, но определение таких случаев дает вам возможность проверить, что с ними все в порядке.
• Обнаружение неправильных освобождений: память, которая освобождается дважды, или функции
free()malloc()• Обнаружение использования уже освобожденной памяти: память, которая освобождена, используется через висячий указатель.
• Обнаружение выхода за границы выделенной памяти: получение доступа или сохранение в память за пределами выделенной границы.
• Предупреждение об использовании неинициализированной памяти. (Многие компиляторы могут выдавать такие предупреждения.)
• Динамическая трассировка функций: когда появляется ошибочный доступ к памяти, вы получаете трассировку от того места, где память используется, до того места, где она была выделена.
• Управление инструментами посредством использования переменных окружения.
• Файлы журналов для необработанной отладочной информации, которая может быть обработана позже для создания полезных отчетов.
Некоторые утилиты просто записывают эти события. Другие организуют жуткое завершение программы приложения (посредством
SIGSEGVНекоторые инструменты требуют изменения исходного кода, такого, как вызов специальных функций или использование особого заголовочного файла, дополнительных
#definemalloc()free()В данном разделе мы рассмотрим три отладчика динамической памяти, а затем предоставим ссылки на несколько других.
15.5.2.1. GNU/Linux
mtraceСистемы GNU/Linux, использующие GLIBC, предоставляют две функции для включения и отключения трассировки памяти во время исполнения.
#include <mcheck.h> /* GLIBC */void mtrace(void);void muntrace(void);Когда вызывается
mtrace()MALLOC_TRACEmuntrace()Использование отдельных функций дает возможность проводить трассировку памяти для определенных частей программы; необязательно отслеживать все. (Мы нашли наиболее полезным включить журналирование в начале программы и все, но эта схема предоставляет гибкость, которую хорошо иметь.)
Когда приложение завершается, вы используете программу
mtracegawkTIDYMEM$ <b>export TIDYMEM=1 MALLOC_TRACE=trace.out</b> /* Экспортировать переменные окружения */$ <b>./gawk 'BEGIN { print "hello, world" }'</b> /* Запустить программу */hello, world$ <b>mtrace ./gawk mtrace.out</b> /* Создать отчет */Memory not freed:-----------------Address Size Caller0x08085858 0x20 at /home/arnold/Gnu/gawk/gawk-3.1.3/main.c:11020x08085880 0xc80 at /home/arnold/Gnu/gawk/gawk-3.1.3/node.c:3980x08086508 0x2 at /home/arnold/Gnu/gawk/gawk-3.1.3/node.c:3370x08086518 0x6 at /home/arnold/Gnu/gawk/gawk-3.1.3/node.c:3370x08086528 0x10 at /home/arnold/Gnu/gawk/gawk-3.1.3/eval.c:20820x08086550 0x3 at /home/arnold/Gnu/gawk/gawk-3.1.3/node.с:3370x08086560 0x3 at /home/arnold/Gnu/gawk/gawk-3.1.3/node.c:3370x080865e0 0x4 at /home/arnold/Gnu/gawk/gawk-3.1.3/field.c:760x08086670 0x78 at /home/arnold/Gnu/gawk/gawk-3.1.3/awkgram.y:13690x08086700 0xe at /home/arnold/Gnu/gawk/gawk-3.1.3/node.c:3370x08086718 0x1f at /home/arnold/Gnu/gawk/gawk-3.1.3/awkgram.y:1259Вывод представляет собой список мест, в которых
gawk15.5.2.2. Electric Fence
В разделе 3.1 «Адресное пространство Linux/Unix» мы описали, как динамическая память выделяется из кучи, которая может расти и сокращаться (с помощью вызовов
brk()sbrk()brk()sbrk()Ну, картина, которую мы там представили, является упрощением действительности. Более развитые системные вызовы (не рассматриваемые в данной книге) позволяют добавлять в адресное пространство процесса дополнительные, необязательно смежные сегменты памяти. Многие отладчики
malloc()SIGSEGV