Трассировка и защита памяти
Хорошая книжка по отладке: https://en.wikibooks.org/wiki/Linux_Applications_Debugging_Techniques
Strace
strace — руководство
ptrace_scope и strace -p PID / gdb -p PID
Что умеет:
Отслеживание системных вызовов с помощью ptrace
- + вывод сопутствующей информации
strace date — сколько системных вызовов? / -c
- + фильтр на вызовы/группы вызовов
-efile/…, -z/-y/-P
strace wc /usr/share/dict/words + все эти ключи
- + у всех подпроцессов
-f, -foo ☺
-eexecve/… i
strace -f -eexecve /bin/sh -c "date; id"
+ трассировка стека вызовов -k и показ параметров (-s###, -v)
с ключами
- + вброс ошибок
ИРЛ:
Какие файлы (не) открывает (в т. ч. все открываемые файлы)
- Почему висит
- Куда полезло в сеть
- Что куда пишет/читает
- …
- Что сделает, если syscall обломается
- …
LD_PRELOAD
Файл с примером:
ld.so — LD_PRELOAD, LD_LIBRARY_PATH и т. д.
- Простой пример:
- And now:
$ cc -shared -o ura.so ura.c $ cc ranex.c -o randex $ ./randex $ LD_PRELOAD=`pwd`/ura.so ./randex
- Обёртка вместо подмены: поиск исходной функции
В ту же тему: ldd
Прочее
ltrace grep -P "a.*b.*c" /etc/printcap
-l libpcre2-8.so.0 / -e pcre2_compile_8
cc -fstack-protector-all
cc -fsanitize=address
Огороды памяти
- EFence/DUMA
- *malloc проекты (gperftools, jmalloc, mimalloc …)
libmemleak и ему подобные
- …
Valgrind
- Полный эмулятор
- В т. ч. память
- ⇒ отслеживать память, стек и кучу, количество вызовов, кеш процессора, треды.
Утечка памяти не обязательно приводит к ошибке. Порча памяти, к сожалению, тоже.
- Доступ к неинициализированной памяти (даже на чтение, если она твоя)
- И даже
- Не-освобождение
Двойной и ошибочный free()
- а также все предыдущие примеры ☺
Статьи:
The Valgrind Quick Start Guide (и вообще сайт)
Д/З
- Прочитать про
Написать программу move.c, принимающую два параметра в командной строке: move infile outfile, которая перемещает содержимое файла infile в файл outfile (если таковой был, его содержимое удаляется), и в случае успеха удаляет infile.
- Программа должна проверять по возможности все возможные ошибки и сообщать о них, в том числе выставляя различный код ошибки
- Программа должна по возможности работать безопасно — не удалять исходный файл, пока целевой не закрыт, удалять целевой файл и сохранять исходный, если есть подозрение, что что-то пошло не так
Написать тесты с помощью strace error injection, которые позволяют проверить как можно больше ошибочных ситуаций (проверяют код ошибки и наличие того файла, который должен был остаться ☺)
Написать .so библиотеку для LD_PRELOAD, при подгрузке которой файл, в имени которого есть строка "PROTECT", не удаляется (как минимум — не удаляется при помощи вашего move). Написать тест, который это проверяет
Как обычно, написать Makefile со сборкой, запусками тестов и очисткой генератов
Создать в репозитории каталог 07_TracingFencing и положить туда решение задачи