Трассировка и защита памяти
Хорошая книжка по отладке: https://en.wikibooks.org/wiki/Linux_Applications_Debugging_Techniques
Strace
Отслеживание системных вызовов с помощью ptrace
- + вывод сопутствующей информации
- + у всех подпроцессов
- + фильтр на вызовы/группы
+ трассировка вызовов -k и показ параметров (-s###, -v)
- + вброс ошибок
ИРЛ:
Какие файлы (не) открывает (в т. ч. все открываемые файлы)
-y
- Почему висит
- Куда полезло в сеть
- Что куда пишет/читает
- …
- Что сделает, если syscall обломается
strace — руководство
Другие похожие инструменты
Файл с примером:
ld.so — LD_PRELOAD, LD_LIBRARY_PATH и т. д.
- …
cc -fstack-protector-all
cc -fsanitize=address
(-fno-omit-frame-pointer)
Огороды памяти
- EFence/DUMA
- *malloc проекты (gperftools, jmalloc, memalloc …)
libmemleak и ему подобные
- …
Valgrind
- Полный эмулятор
- В т. ч. память
- ⇒ отслеживать память, стек и кучу, количество вызовов, кеш процессора, треды.
Утечка памяти не обязательно приводит к ошибке. Порча памяти, к сожалению, тоже.
The Valgrind Quick Start Guide (и вообще сайт)
Д/З
- Прочитать про
Создать в репозитории каталог 07_DebuggingTracing и положить туда решение следующей задачи:
Выяснить, какой функцией пользуется команда rm при удалении обычного файла
Написать LD_PRELOAD-враппер вокруг этой функции, который при попытке удалить файл с именем, содержащим подстроку FIX, возвращал бы ошибку EPERM
- Написать как минимум Makefile (или любой другой сценарий) для
- сборки библиотеки-враппера
- тестирования библиотеки-враппера (без враппера два файла удаляются, с враппером удаляется только один, плюс можно ещё exit status проверить, если не лень)
- удаления генератов
(необязательно) оформить это в виде autotools/CMake/… проекта
если делать всё по инструкции (читать так: 5.4.1, затем 5.3, затем 3.2, в котором написано, что библиотека откладывается в каталог .libs) вам понадобится установить libtool
- У меня вышло как-то так: