Отслеживание сигналов и системных вызовов: команды strace, truss и tusc

Иногда определение действий, действительно выполняемых данным процессом, может быть затруднительным. Умозаключение приходится делать на основе косвенных данных, полученных от файловой системы и с помощью таких средств, как программа ps.

Linux позволяет непосредственно следить за процессом с помощью команды strace, которая отображает каждый системный вызов, выполняемый процессом, и каждый получаемый им сигнал. Аналогичной командой для систем Solaris и AIX является команда truss. В HP-UX эквивалентом служит команда tusc, при этом утилиту tusc необходимо инсталлировать отдельно.

Эту команду можно даже связать с выполняемым процессом, последить за ним в течение некоторого времени, а затем отключиться от процесса, не прерывая его. (По крайней мере, как правило. Команда strace может прерывать системные вызовы. В этих случаях отслеживаемый процесс должен быть подготовлен для повторного запуска этих вызовов. Таково стандартное правило выполнения программ в среде UNIX, но оно не всегда соблюдается.)

Хотя системные вызовы выполняются на сравнительно низком уровне абстракции, обычно вывод команды strace позволяет получить достаточно полную информацию об активности процесса. Например, следующий журнал был получен в результате выполнения команды strace применительно к активной копии команды top.

redhat$    sudo strace -p 5810

gettimeofday(   {1116193814,   213881},   {300,   0}   )  =0

open("/ргос",   0_RD0NLY|0_N0NBL0CK|0_LARGEFILE|0_DIRECT0RY)            =   7

fstat64(7,   {st_mode=S_IFDIR|0555,   st_size=0,   ...}   )             =0

fcntl64(7,   F_SETFD,   FD_CLOEXEC)          =   0

getdents64(7,   /*  36 entries  */,   1024)          =  1016

getdents64(7,   /*  39 entries  */,   1024)          =  1016

stat64("/proc/l",   {st_mode=S_IFDIR|0555,   st_size=0,   ...}     )       =0

open("/proc/l/stat",   0_RD0NLY)   =  8

read(8,   "1   (init)   S  0  0  0  0  -1  4194560  73"...,   1023)            =  191

close (8)                          .     =  0

Команда strace не только отображает имя каждого системного вызова, выполненного процессом, но и раскрывает аргументы и отображает результирующий код, возвращенный ядром.

Команда strace снабжена флагами, которые описаны в соответствующей man-странице. Например, флаг -f используется для разветвленных процессов, и его полезно применять для отслеживания демонов (например, httpd), которые порождают множество дочерних процессов. Опция -е позволяет отображать только файловые операции, что особенно удобно для определения местоположения "неуловимых" файлов конфигурации.

В этом примере команда top начинает свою работу с проверки текущего значения времени. Затем она открывает каталог /ргос и считывает его содержимое, тем самым получая список процессов, выполняемых в текущий момент. Команда top обращается к статической копии каталога, представляющей процесс init, а затем открывает /ргос/1/stat, чтобы прочесть информацию о состоянии этого процесса.

Вот даже более простой пример (применительно к команде date) использования команды truss в системе Solaris.

solaris$ truss date

time()      = 1242507670

brk(0x00024D30)  = 0

brk(0x00026D30)  = 0
open("/usr/share/lib/zoneinfo/US/Mountain", 0_RD0NLY) = 3

fstat64(3, OxFFBFFAFO)   = 0

read(3, " T Z i f\0\0\0\0\0\0\0\0". ., 877)           = 877

close(3)  = 0

ioctl(1, TCGETA, 0xFFBFFA94)       = 0

fstat64(1, 0xFFBFF9B0)      = 0
write(1, "Sat  May  16  1".., 29)         29

Sat May 16 14:56:46 MDT 2009 _exit(0)

Здесь после вывода информации о распределении памяти и библиотечных зависимостях (не показана), команда date использует системный вызов time для считывания системного времени, открывает файл, соответствующий часовому поясу для определения нужного смещения, и выводит отметку даты и времени с помощью системного вызова write.

 

Комментарии (0)

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.