Поиск по сайту:

Учебное пособие по команде Linux strace для начинающих (8 примеров)


На этой странице

  1. Q1. Как использовать команду strace?
  2. Вопрос 2. Как понять вывод strace?
  3. Вопрос 3. Как сделать указатель инструкций печати strace?
  4. Q4. Как сделать временную метку strace для каждого системного вызова?
  5. В5. Как поставить перед каждой строкой вывода время по часам?
  6. Q6. Как заставить strace показывать время, потраченное на системные вызовы?
  7. Q7. Как заставить strace печатать сводку вместо обычного вывода?
  8. Заключение

Командная строка Linux предлагает множество инструментов, полезных для разработчиков программного обеспечения. Одной из них является strace, команда для отслеживания системных вызовов и сигналов Linux. Основы strace, которые мы обсудим в этом уроке, на нескольких простых для понимания примерах.

Но прежде чем мы это сделаем, стоит упомянуть, что все примеры в этой статье были протестированы на машине с Ubuntu 22.04 LTS и Debian 11.

Команда strace в Linux позволяет отслеживать системные вызовы и сигналы. Ниже приведен его синтаксис:

strace [OPTIONS] command

И вот как это объясняет справочная страница инструментов:

       In  the simplest case strace runs the specified command until it exits.
       It intercepts and records the  system  calls  which  are  called  by  a
       process  and  the signals which are received by a process.  The name of
       each system call, its arguments and its return  value  are  printed  on
       standard error or to the file specified with the -o option.

strace is a useful diagnostic, instructional, and debugging tool.  Sys?
       tem administrators, diagnosticians and trouble-shooters  will  find  it
       invaluable  for  solving problems with programs for which the source is
       not readily available since they do not need to be recompiled in  order
       to trace them.  Students, hackers and the overly-curious will find that
       a great deal can be learned about a system  and  its  system  calls  by
       tracing  even  ordinary programs.  And programmers will find that since
       system calls and signals are events  that  happen  at  the  user/kernel
       interface,  a close examination of this boundary is very useful for bug
       isolation, sanity checking and attempting to capture race conditions.

Ниже приведены несколько примеров в стиле вопросов и ответов, которые должны дать вам лучшее представление о том, как работает команда strace.

Установка команды strace

Команда strace не установлена по умолчанию в большинстве систем, чтобы установить ее в Debian и Ubuntu, выполните следующую команду:

sudo apt-get install strace

Q1. Как использовать команду strace?

Основное использование простое, просто запустите strace с командой в качестве ввода. Например, я использовал его с командой ls:

strace ls

И вот результат, полученный в моей системе:

Q2. Как понять вывод strace?

Как вы можете видеть на снимке экрана в предыдущем разделе, команда strace выводит много информации. Поэтому вам нужно знать, как это понимать.

Следующие выдержки из справочной страницы дают точное объяснение:

       Each line in the trace contains the system call name, followed  by  its
       arguments  in parentheses and its return value.  An example from strac?
       ing the command "cat /dev/null" is:

           open("/dev/null", O_RDONLY) = 3

       Errors (typically a return value of -1) have the errno symbol and error
       string appended.

           open("/foo/bar", O_RDONLY) = -1 ENOENT (No such file or directory)

       Signals are printed as signal symbol and decoded siginfo structure.  An
       excerpt from stracing and interrupting the command "sleep 666" is:

           sigsuspend([] <unfinished ...>
           --- SIGINT {si_signo=SIGINT, si_code=SI_USER, si_pid=...} ---
           +++ killed by SIGINT +++

Q3. Как сделать указатель инструкций печати strace?

Есть опция -i, которая указывает strace печатать указатель инструкций во время системного вызова.

Например:

strace -i ls

Вот результат:

Таким образом, вы можете видеть, что указатель инструкции был напечатан в каждой строке вывода.

Q4. Как сделать временную метку strace для каждого системного вызова?

Существует параметр командной строки -r, который указывает strace отображать относительную временную метку при входе в каждый системный вызов. На странице руководства инструментов говорится, что это записывает разницу во времени между началом последовательных системных вызовов.

Например:

strace -r ls

Ниже приведен вывод, полученный этой командой:

Таким образом, вы можете видеть, что относительная временная метка была создана в начале каждой строки.

Q5. Как поставить перед каждой строкой вывода время по часам?

Если вы хотите, чтобы каждая строка в выводе strace начиналась с часов, это можно сделать с помощью параметра командной строки -t.

Например:

strace -t ls

Вот вывод этой команды в моей системе:

Итак, вы можете видеть, что системное время печатается в начале каждой строки.

Обратите внимание, что есть еще два связанных варианта, которые предлагает strace:

-tt         
If given twice, the time printed will include the microseconds.

-ttt       
If given thrice, the  time  printed  will  include  the microseconds and the leading portion will
be printed as the number of seconds since the epoch.

Q6. Как заставить strace показывать время, потраченное на системные вызовы?

Этого можно добиться с помощью параметра командной строки -T.

Например:

strace -T ls

Ниже приведен вывод:

Таким образом, вы можете видеть, что время, потраченное на системные вызовы, печатается в конце каждой строки.

Q7. Как заставить strace печатать сводку вместо обычного вывода?

Вывод командной строки -c можно использовать, если вы хотите, чтобы инструмент выдавал сводку.

Например, следующая команда:

strace -c ls

произвел этот вывод в моей системе:

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 93.66    0.000133           5        28           write
  6.34    0.000009           1        11           close
  0.00    0.000000           0         7           read
  0.00    0.000000           0        10           fstat
  0.00    0.000000           0        17           mmap
  0.00    0.000000           0        12           mprotect
  0.00    0.000000           0         1           munmap
  0.00    0.000000           0         3           brk
  0.00    0.000000           0         2           rt_sigaction
  0.00    0.000000           0         1           rt_sigprocmask
  0.00    0.000000           0         2           ioctl
  0.00    0.000000           0         8         8 access
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         2           getdents
  0.00    0.000000           0         2         2 statfs
  0.00    0.000000           0         1           arch_prctl
  0.00    0.000000           0         1           set_tid_address
  0.00    0.000000           0         9           openat
  0.00    0.000000           0         1           set_robust_list
  0.00    0.000000           0         1           prlimit64
------ ----------- ----------- --------- --------- ----------------
100.00    0.000142                   120        10 total

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

Заключение

Здесь мы только коснулись поверхности, так как команда strace также предлагает множество других функций. Как только вы закончите практиковать то, что мы здесь обсуждали, перейдите на справочную страницу strace, чтобы узнать больше об этом инструменте.