Трассировка вызовов
Хорошая книжка по отладке: https://en.wikibooks.org/wiki/Linux_Applications_Debugging_Techniques
Strace
strace — руководство
- Статьи на хабре:
kernel.yama.ptrace_scope и strace -p PID / gdb -p PID
Что умеет:
Отслеживание системных вызовов с помощью ptrace
- + вывод сопутствующей информации
strace date — сколько системных вызовов? / -c
- + фильтр на вызовы/группы вызовов
-efile/…, -z/-y/-P
strace wc /usr/share/dict/words + все эти ключи
(also: язык описания -e в strace)
- + у всех подпроцессов
-f, -foo ☺
-eexecve/…
strace -f -eexecve /bin/sh -c "date; id"
+ трассировка стека вызовов -k и показ параметров (-s###, -v)
с ключами -s1024 -vv
- + вброс ошибок
--tips
ИРЛ:
Какие файлы (не) открывает (в т. ч. все открываемые файлы) (-efile / -z)
Что оттуда берёт / кладёт (-s###)
Почему висит (-p)
- Куда полезло в сеть
- …
- Что сделает, если syscall обломается — error injection
- …
если будет время: те самые use cases
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
- …
- …
Д/З
- Прочитать про
Написать программу move.c, принимающую два параметра в командной строке: move infile outfile, которая перемещает содержимое файла infile в файл outfile (если таковой был, его содержимое удаляется), и в случае успеха удаляет infile.
- Программа должна проверять по возможности все возможные ошибки и сообщать о них, в том числе выставляя различный код ошибки
- Программа должна по возможности работать безопасно — не удалять исходный файл, пока целевой не закрыт, удалять целевой файл и сохранять исходный, если есть подозрение, что что-то пошло не так
Написать тесты с помощью strace error injection, которые позволяют проверить как можно больше ошибочных ситуаций (проверяют код ошибки и наличие того файла, который должен был остаться ☺)
Написать .so библиотеку для LD_PRELOAD, при подгрузке которой файл, в имени которого есть строка "PROTECT", не удаляется (как минимум — не удаляется при помощи вашего move). Написать тест, который это проверяет
Как обычно, написать Makefile со сборкой, запусками тестов и очисткой генератов
Создать в репозитории каталог 06_Tracing и положить туда решение задачи