Основы траблшутинга процессов
Введение в траблшутинг процессов
В этой части предполагается, что вы поняли и, что не менее важно, попробовали абсолютно все из вышеописанного. В этом разделе мы отойдем от классического вида наших лабораторных и рассмотрим базовые инструменты и методы траблшутинга процессов.
strace
В траблшутинге часто будет помогать утилита strace, с помощью которой можно посмотреть системные вызовы (syscall) программы. Выполните strace true, чтобы увидеть как на низком уровне функционирует утилита true. Самостоятельно ответьте что делает true и false, опираясь на вывод strace.
Зачастую исследователь хочет увидеть конкретные системные вызовы (например, только запись в файловый дескриптор), и тут на помощь приходит флаг -e: выполнив strace -e read,write true мы увидим только системные вызовы read() и write().
Периодически также приходится использовать знакомый вам по курсу NASM'a
gdb
Если процесс где-то падает, то попробуйте снять с него трейсы. Вероятно, там вы увидите не только падение, но и то, что ему предшествовало.
straceтакже может подключиться к конкретному работающему процессу, используя флаг-pstrings
При траблшутинге бинарных файлов, где у вас нет исходного кода программы, также хорошей практикой будет изучить вывод strings - найденые человекочитаемые строки в exec файле.
Например, если процесс не может выполнить запись в конкретный файл, возможно, в выводе strings окажется, что процесс предварительно зафризил (fsfreeze -f) файловую систему. Обнаружить это путем изучения собранных трейсов будет гораздо тяжелее.
lsof
Чтобы вам постоянно не приходилось самостоятельно исследовать procfs, GNU/Linux предоставляет ряд интерфейсов. Один из них - lsof. Выполнив команду lsof -p <PID> вы можете посмотреть все файловые дескрипторы (а также сокеты, пайпы, ...), которые открыл на чтение (read) процесс. Вывод lsof -p <PID> будет содержать вывод ls /proc/<PID>/fd с приятными дополнениями.
Самостоятельно изучите иные флаги
lsof