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


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

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

и

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

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

10 240

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 output.

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

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 секунды на системные вызовы, то построение программы не принесет вам много пользы, проблема заключается в вашем коде, что обычно является логической проблемой, или программа на самом деле должна занять столько времени для запуска.

самая большая проблема с strace / ltrace считывает их вывод. Если вы не знаете, как выполняются вызовы или, по крайней мере, имена системных вызовов/функций, будет трудно расшифровать значение. Зная, что функции возвращают также может быть очень полезно, особенно для различных кодов ошибок. Хотя это боль для расшифровки, они иногда действительно возвращают жемчужину знаний; однажды я увидел ситуацию, когда у меня закончились 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