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