Как следует использовать strace?

коллега однажды сказал мне, что последний вариант, когда все не удалось отладить в Linux, - использовать strace.

Я пытался изучить науку, стоящую за этим странным инструментом, но я не гуру системного администратора, и я действительно не получил результатов.

и

  • что это такое и что он делает?
  • как и в каких случаях его следует использовать?
  • как следует понимать вывод и обработано?

короче, простыми словами, как это работает?

10 ответов


Strace Обзор
strace можно рассматривать как легкий отладчик. Это позволяет программисту / пользователю быстро узнать, как программа взаимодействует с ОС. Он делает это, отслеживая системные вызовы и сигналы.

использует
Хорошо, когда у вас нет исходного кода или вы не хотите беспокоиться, чтобы действительно пройти через него.
Кроме того, полезно для вашего собственного кода, если вы не хотите открывать GDB, но просто заинтересованы в понимание внешнего взаимодействия.

хорошее небольшое введение
Я столкнулся с этим вступлением, чтобы использовать strace на днях:strace Привет мир


простыми словами, strace отслеживает все системные вызовы, выданные программой вместе с их кодами возврата. Подумайте о таких вещах, как операции с файлами/сокетами и гораздо более неясные.

Это наиболее полезно, если у вас есть некоторые рабочие знания C, так как здесь системные вызовы будут более точно соответствовать стандартным вызовам библиотеки C.

Предположим, ваша программа /usr / local/bin / cough. Просто используйте:

strace /usr/local/bin/cough <any required argument for cough here>

или

strace -o <out_file> /usr/local/bin/cough <any required argument for cough here>

написать в 'out_file'.

все выходные данные strace будут отправлены в stderr (будьте осторожны, сам объем его часто запрашивает перенаправление в файл). В простейших случаях ваша программа будет прервана с ошибкой, и вы сможете увидеть, где ее последние взаимодействия с ОС в выводе strace.

более подробная информация должна быть доступна с:

man strace

strace перечисляет все


Strace выделяется как инструмент для исследования производственных систем, где вы не можете позволить себе запускать эти программы под отладчиком. В частности, мы использовали strace в следующих двух ситуациях:

  • программа foo, похоже, находится в тупике и стала невосприимчивой. Это может быть целью для gdb; однако мы не всегда имели исходный код или иногда имели дело со сценариями, которые не были прямолинейными для запуска под отладчиком. В этом деле, вы запускаете strace в уже запущенной программе, и вы получите список выполняемых системных вызовов. Это особенно полезно, если вы исследуете клиент / серверное приложение или приложение, которое взаимодействует с базой данных
  • исследование того, почему программа медленная. В частности, мы только что перешли на новую распределенную файловую систему, и новая пропускная способность системы была очень медленной. Вы можете указать strace с опцией '- T', которая расскажет вам, сколько времени было потрачено в каждом системный вызов. Это помогло определить, почему файловая система заставляла вещи замедляться.

пример анализа с использованием strace см. В моем ответе на этот вопрос.


Я использую strace все время для отладки проблем с разрешениями. Техника такая:

$ strace -e trace=open,stat,read,write gnome-calculator

здесь gnome-calculator - это команда, которую вы хотите запустить.


strace-tfp PID будет контролировать системные вызовы процесса PID, таким образом, мы можем отлаживать/контролировать состояние процесса/программы.


Strace может использоваться как инструмент отладки или как примитивный профилировщик.

в качестве отладчика вы можете видеть, как вызывались, выполнялись и возвращались заданные системные вызовы. Это очень важно, так как позволяет увидеть не только то, что программа не удалась, но и почему программа не удалась. Обычно это просто результат паршивого кодирования, не улавливающего всех возможных результатов программы. В других случаях это просто жестко закодированные пути к файлам. Без strace вы можете догадаться, что пошло не так, где и как. С strace вы получаете разбивку syscall, обычно просто глядя на возвращаемое значение говорит вам много.

профилирование другое применение. Вы можете использовать его для временного выполнения каждого syscalls индивидуально или как агрегат. Хотя этого может быть недостаточно, чтобы решить ваши проблемы, это, по крайней мере, значительно сузит список потенциальных подозреваемых. Если вы видите много пар fopen/close в одном файле, вы, вероятно, излишне открываете и закрываете файлы при каждом выполнении цикла, вместо того, чтобы открывать и закрывать его вне петли.

Ltrace-близкий кузен strace, также очень полезный. Вы должны научиться различать, где находится ваше узкое место. Если общее выполнение составляет 8 секунд, и вы тратите всего 0,05 секунды на системные вызовы, то stracing программа не принесет вам много пользы, проблема в вашем коде, который обычно является логической проблемой, или программа на самом деле должна занять столько времени.

самая большая проблема с strace / ltrace считывает их вывод. Если вы не знаете, как выполняются вызовы или, по крайней мере, имена syscalls/функций, будет трудно расшифровать значение. Знание того, что возвращают функции, также может быть очень полезным, особенно для разных кодов ошибок. Хотя это больно расшифровывать, они иногда действительно возвращают жемчужину знаний; однажды я увидел ситуацию, когда у меня закончились inodes, но не из свободного пространства, поэтому все обычные утилиты не дали мне никакого предупреждения, Я просто не мог сделать новый файл. Чтение кода ошибки с выхода strace указало мне в правильном направлении.


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

один хороший случай использования strace-отладка условий гонки во время создания временного файла. Например, программа, которая может создавать файлы путем добавления идентификатора процесса (PID) к какой-либо предыдущей строке, может столкнуться с проблемами в многопоточных сценариях. [PID+TID (идентификатор процесса + идентификатор потока) или Лучший системный вызов, такой как mkstemp, исправит это].

Это также хорошо для отладки сбоев. Вы можете найти эта (моя) статья о strace и сбоях отладки полезное.


Strace-это инструмент, который сообщает вам, как ваше приложение взаимодействует с вашей операционной системой.

Он делает это, сообщая вам, какие системные вызовы ОС использует ваше приложение и с какими параметрами он их называет.

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

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

и это только верхушка айсберга.


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

это именно то, что мы видим. Системный вызов. Если сравнить strace и ltrace разница более очевидна.

$>strace -c cd
Desktop  Documents  Downloads  examples.desktop  Music  Pictures  Public  Templates  Videos
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
  0.00    0.000000           0         7           read
  0.00    0.000000           0         1           write
  0.00    0.000000           0        11           close
  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.000000                    93        10 total

С другой стороны есть ltrace это отслеживает функции.

$>ltrace -c cd
Desktop  Documents  Downloads  examples.desktop  Music  Pictures  Public  Templates  Videos
% time     seconds  usecs/call     calls      function
------ ----------- ----------- --------- --------------------
 15.52    0.004946         329        15 memcpy
 13.34    0.004249          94        45 __ctype_get_mb_cur_max
 12.87    0.004099        2049         2 fclose
 12.12    0.003861          83        46 strlen
 10.96    0.003491         109        32 __errno_location
 10.37    0.003303         117        28 readdir
  8.41    0.002679         133        20 strcoll
  5.62    0.001791         111        16 __overflow
  3.24    0.001032         114         9 fwrite_unlocked
  1.26    0.000400         100         4 __freading
  1.17    0.000372          41         9 getenv
  0.70    0.000222         111         2 fflush
  0.67    0.000214         107         2 __fpending
  0.64    0.000203         101         2 fileno
  0.62    0.000196         196         1 closedir
  0.43    0.000138         138         1 setlocale
  0.36    0.000114         114         1 _setjmp
  0.31    0.000098          98         1 realloc
  0.25    0.000080          80         1 bindtextdomain
  0.21    0.000068          68         1 opendir
  0.19    0.000062          62         1 strrchr
  0.18    0.000056          56         1 isatty
  0.16    0.000051          51         1 ioctl
  0.15    0.000047          47         1 getopt_long
  0.14    0.000045          45         1 textdomain
  0.13    0.000042          42         1 __cxa_atexit
------ ----------- ----------- --------- --------------------
100.00    0.031859                   244 total

хотя я проверил руководства несколько раз, я не нашел происхождение имени strace но это скорее системный вызов Трейс, поскольку это очевидно.

есть три большие заметки, чтобы сказать о strace.

Примечание 1: Обе эти функции strace и ltrace используют системный вызов ptrace. Так что ptrace системный вызов эффективно, как strace строительство.

системный вызов ptrace() предоставляет средство, с помощью которого один процесс ( "Трейсер") можно наблюдать и контролировать выполнение другого процесса ("tracee"), и исследовать и изменить память Трейси и реестры. Он в основном используется для реализации отладки точки останова и отслеживание системных вызовов.

примечание 2: Есть различные параметры, которые можно использовать с strace С strace может быть очень многословным. Мне нравится экспериментировать с -c что похоже на резюме вещей. На основе -c вы можете выбрать один системный вызов, как -e trace=open где вы увидите только этот вызов. Это может быть интересно, если вы изучаете, что файлы будут открываться в команду трассировке. И, конечно же, вы можете использовать grep для той же цели, но обратите внимание, что вам нужно перенаправить, как это 2>&1 | grep etc чтобы понять, что файлы конфигурации ссылаются, когда команда была выпущена.

Примечание 3: я нахожу это очень важное примечание. Вы не ограничены определенной архитектурой. strace взорвет вас, так как он может отслеживать двоичные файлы разных архитектур. enter image description here