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