Отладка и диагностика
GDB – полноценный консольный отладчик для ОС который позволяет останавливать выполнение в произвольных точках, отслеживать состояние переменных, стека, памяти и регистров и т. д. Возможна удалённая отладка.
Запуск осуществляется с помощью команды:
gdb <имя исполняемого файла>
Также запуск можно осуществить с помощью команды:
gdb
После запуска команды можно указать файл для отладки:
file <имя исполняемого файла>
Еще можно подключиться к удалённому сеансу отладки:
target remote <адрес хоста>:<порт>
Также можно отлаживать уже запущенную программу (нужны права суперпользователя):
attach <pid>
Для запуска отлаживаемой программы используется команда:
run <аргументы>
где
- <аргументы> — параметры, которые передаются программе при запуске (аналогично тому, как они указываются при обычном запуске из терминала).
Если программа останавливается на установленной точке останова или при возникновении сигнала, GDB передаёт управление пользователю.
Для повторного запуска программы без выхода из GDB используется та же команда run, при этом предыдущие параметры можно не указывать — они сохраняются автоматически.
Точки останова можно установить командой:
Или, если отлаживается, например, программа из одного файла, можно использовать следующую команду:
break main.c:15После остановки программы (например, на точке останова) для поэтапного анализа работы используются следующие команды:break 15 - step – выполняет текущую строку и переходит внутрь вызываемой функции, если она присутствует;
- next – выполняет текущую строку без входа в вызываемую функцию, переходя к следующей строке после её выполнения;
- continue – возобновляет выполнение программы до следующей точки останова, получения сигнала или завершения работы программы;
- quit – завершает сеанс работы GDB и возвращает пользователя в терминал.
Для анализа значений переменных и выражений используется команда:
Она позволяет вычислить и вывести значение любой переменной или выражения языка C, доступного в текущей точке выполнения программы. Для просмотра исходного кода в контексте текущей строки применяется команда:
print <выражение>Она выводит фрагмент программы вокруг текущего места выполнения, что удобно при пошаговой отладке. GDB наиболее эффективен при наличии исходных кодов и отладочной информации (файлов с символами). Дополнительные сведения о возможностях отладчика приведены в справочной системе GDB:listВ некоторых случаях для анализа работы программы может быть удобнее использовать системные инструменты трассировки, такие как strace, которые позволяют отслеживать системные вызовы и сигналы без необходимости пошаговой отладки.info gdb
Консольный отладчик GDB
strace – утилита, позволяющая отслеживать системные вызовы, используемые программой, и получаемые ей сигналы.
Запуск осуществляется с помощью одной из команд:
strace program
или
strace -p pid
Для отладки уже запущенной программы (нужны права суперпользователя).
Можно отлаживать многопроцессные программы, передав ключ -f. В этом случае будут печататься системные вызовы и сигналы не только родителя, но и детей, порождённых после присоединения к процессу. Можно указать файл, в который strace будет писать вывод:
strace -o log.txt program
Для системных вызовов strace печатает имя вызова, переданные ему аргументы и значение, которое он вернул. Можно ограничить количество отслеживаемых системных вызовов:
strace -e trace=open,close,read,write,fork,exec program
Так же можно выполнить команду для сигналов:
strace -e signal=!SIGTERM program
Можно отслеживать данные, читаемые или записываемые в файловые дескрипторы:
strace -e read=0,3 program
strace -e write=1,2,4 program
Кроме того, можно вмешиваться в работу процесса, например, подменяя результаты системных вызовов. Об этом подробнее можно прочитать в справочной документации strace по команде:
man 1 strace
Диагностика и отладка процессов с помощью утилиты strace
В ОС существует псевдофайловая система procfs, которая в большинстве дистрибутивов монтируется в общую ФС в каталог /proc. У данной ФС нет физического места размещения, нет блочного устройства, такого как жесткий диск. Вся информация, хранимая в данном каталоге, находится в оперативной памяти компьютера, контролируется ядром ОС и не предназначена для хранения файлов пользователя.Различную отладочную информацию можно также почерпнуть из procfs. Сведения о процессе с id pid можно найти в каталоге /proc/pid. Из такой информации можно выделить:
- Файл /proc/pid/exe является символической ссылкой на бинарный файл работающего процесса;
- Файл /proc/pid/status, содержащий различные данные о состоянии процесса, такие как:
- имя исполняемого файла;
- umask процесса;
- собственно состояние процесса;
- uid и gid процесса;
- количество потоков процесса.
- маски заблокированных, принимаемых и игнорируемых сигналов; маски представлены в виде 8 байт, среди которых бит с номером "i" отвечает сигналу с номером "i"; биты отсчитываются с единицы, справа налево;
- Файл /proc/pid/syscall содержит номера работающих в данный момент системных вызовов, вызванных из программы, и их аргументы;
- Файл /proc/pid/maps содержит список виртуальных страниц в адресном пространстве программы, файл /proc/pid/pagemap, их отображение в физические страницы;
- Файл /proc/pid/stack содержит трейс стека ядра;
- Каталог /proc/pid/fd содержит ссылки на файлы, соответствующие открытым в процессе файловым дескриптором;
- Каталог /proc/pid/fdinfo содержит файлы с информацией об этих дескрипторах;
- Файл /proc/pid/limits содержит таблицу лимитов для процесса.
Более полное представление о структуре procfs можно получить в документации:
man 5 proc
Мониторинг и анализ состояния системы через псевдо-файловую систему /proc (procfs)
Основу классической модели аутентификации в ОС составляют файлы /etc/passwd и /etc/shadow, содержащие информацию об учетных записях пользователей и их паролях.
Модули PAM обращаются к этим файлам при проверке подлинности, поэтому понимание их структуры и назначения необходимо для администрирования системы безопасности.