Трассировка и защита памяти
Хорошая книжка по отладке: https://en.wikibooks.org/wiki/Linux_Applications_Debugging_Techniques
Strace
Отслеживание системных вызовов с помощью ptrace
- + вывод сопутствующей информации
- + у всех подпроцессов
-f, -foo ☺
- + фильтр на вызовы/группы
-eexecve
+ трассировка стека вызовов -k и показ параметров (-s###, -v)
ptrace_scope и strace / gdb с ключом -p
- + вброс ошибок
И вообще доклады автора тут ☺
ИРЛ:
Какие файлы (не) открывает (в т. ч. все открываемые файлы)
-y
- Почему висит
- Куда полезло в сеть
- Что куда пишет/читает
- …
- Что сделает, если syscall обломается
strace — руководство
Пример: берём getline — что может пойти не так?
$ strace -eread -P /usr/share/dict/linux.words -e fault=read:error=EPERM:when=5 -y ./a.out /usr/share/dict/words > o
Другие похожие инструменты
Файл с примером:
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
- Обёртка вместо подмены: поиск исходной функции
- …
cc -fstack-protector-all
cc -fsanitize=address
Огороды памяти
- EFence/DUMA
- *malloc проекты (gperftools, jmalloc, memalloc …)
libmemleak и ему подобные
- …
Valgrind
- Полный эмулятор
- В т. ч. память
- ⇒ отслеживать память, стек и кучу, количество вызовов, кеш процессора, треды.
Утечка памяти не обязательно приводит к ошибке. Порча памяти, к сожалению, тоже.
The Valgrind Quick Start Guide (и вообще сайт)
Д/З
- Прочитать про
Написать программу move.c, принимающую два параметра в командной строке: move infile outfile, которая перемещает содержимое файла infile в файл outfile (если таковой был, его содержимое удаляется), и в случае успеха удаляет infile.
- Программа должна проверять по возможности все возможные ошибки и сообщать о них, в том числе выставляя различный код ошибки
- Программа должна по возможности работать безопасно — не удалять исходный файл, пока целевой не закрыт, удалять целевой файл и сохранять исходный, если есть подозрение, что что-то пошло не так
Написать тесты с помощью strace error injection, которые позволяют проверить как можно больше ошибочных ситуаций (проверяют код ошибки и наличие того файла, который должен был остаться ☺)
Написать .so библиотеку для LD_PRELOAD, при подгрузке которой файл, в имени которого есть строка "PROTECT", не удаляется (как минимум — не удаляется при помощи вашего move). Написать тест, который это проверяет
Как обычно, написать Makefile со сборкой, запусками тестов и очисткой генератов
Создать в репозитории каталог 06_TracingFencing и положить туда решение задачи