Как использовать strace? - PullRequest
       56

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

256 голосов
/ 06 октября 2008

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

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

Итак,

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

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

Ответы [ 11 ]

178 голосов
/ 06 октября 2008

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

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

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

60 голосов
/ 06 октября 2008

Проще говоря, 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
34 голосов
/ 06 октября 2008

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

Тем не менее, если ваша проблема связана с файлами, путями или значениями среды, запуск strace в проблемной программе и перенаправление вывода в файл, а затем поиск этого файла в строке path / file / env могут помочь вам понять, что представляет из себя ваша программа. на самом деле пытается сделать, в отличие от того, что вы ожидали.

15 голосов
/ 04 мая 2015

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

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

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

15 голосов
/ 07 октября 2008

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

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

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

7 голосов
/ 19 июня 2014

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

6 голосов
/ 03 августа 2009

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

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

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

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

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

4 голосов
/ 03 августа 2009

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

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

Это также хорошо для отладки сбоев. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

4 голосов
/ 06 октября 2008

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

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

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

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

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

1 голос
/ 25 августа 2018

Мне понравились некоторые ответы, где написано 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 () предоставляет средство, с помощью которого один процесс ( «трассировщик») может наблюдать и контролировать выполнение другого процесса («след»), а также изучить и изменить память следа и регистры. Он в основном используется для реализации отладки точек останова и отслеживание системных вызовов.

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

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

...