Коллега однажды сказал мне, что последний вариант, когда все не удалось отладить в Linux, это использовать strace .
Я пытался изучить науку за этим странным инструментом, но я не гуру системного администратора, и я действительно не получил результатов.
Так,
- Что это такое и для чего оно нужно?
- Как и в каких случаях его следует использовать?
- Как следует понимать и обрабатывать результаты?
Вкратце, простыми словами , как это работает?
man strace
действительно легким для чтения и полезным. (PS не знал о strace до вчерашнего дня и не эксперт по Linux)Ответы:
Strace Overview
strace можно рассматривать как легкий отладчик. Это позволяет программисту / пользователю быстро узнать, как программа взаимодействует с ОС. Это осуществляется путем мониторинга системных вызовов и сигналов.
Используется
хорошо, когда у вас нет исходного кода или вы не хотите, чтобы его действительно изучали.
Также полезно для вашего собственного кода, если вы не хотите открывать GDB, а просто заинтересованы в понимании внешнего взаимодействия.
Хорошее небольшое введение
я наткнулся на это введение, чтобы использовать strace только на днях: strace hello world
источник
ltrace
stackoverflow.com/a/52012215/5884955-EFAULT
(упс, только для чтения буфер) или-ENOENT
(ой, бежал из неправильного каталога, где относительный путь не работал).)Проще говоря, strace отслеживает все системные вызовы, выпущенные программой, вместе с их кодами возврата. Подумайте о таких вещах, как операции с файлами / сокетами и многое другое.
Это наиболее полезно, если у вас есть некоторые практические знания C, поскольку здесь системные вызовы более точно обозначают стандартные вызовы библиотеки C.
Допустим, ваша программа / usr / local / bin / cough. Просто используйте:
или
записать в 'out_file'.
Весь вывод strace будет идти в stderr (будьте осторожны, его громкость часто требует перенаправления в файл). В простейших случаях ваша программа будет прервана с ошибкой, и вы сможете увидеть, где она в последний раз взаимодействует с ОС, в выводе strace.
Более подробная информация должна быть доступна с:
источник
strace перечисляет все системные вызовы, сделанные процессом, к которому он применяется. Если вы не знаете, что означают системные вызовы, вы не сможете получить много пробега от этого.
Тем не менее, если ваша проблема связана с файлами, путями или значениями среды, запуск strace для проблемной программы и перенаправление вывода в файл, а затем поиск этого файла в строке пути / file / env может помочь вам увидеть, что ваша программа на самом деле пытается делать, в отличие от того, что вы ожидали.
источник
strace <prog_name>
отследить программу.strace -o <out_file> <prog_name>
положить в файлstrace -e open myprog
ИЛИ для всех системных вызовов, связанных с файлами:strace -e file myprog
Strace выделяется как инструмент для исследования производственных систем, где вы не можете позволить себе запускать эти программы под отладчиком. В частности, мы использовали strace в следующих двух ситуациях:
Для примера анализа использования strace см. Мой ответ на этот вопрос .
источник
Я все время использую strace для устранения проблем с разрешениями. Техника идет так:
Где
gnome-calculator
команда, которую вы хотите запустить.источник
strace -tfp PID будет отслеживать системные вызовы процесса PID, поэтому мы можем отлаживать / отслеживать состояние нашего процесса / программы.
источник
Strace можно использовать как инструмент отладки или как примитивный профилировщик.
Как отладчик, вы можете видеть, как данные системные вызовы вызывались, выполнялись и что они возвращали. Это очень важно, так как позволяет увидеть не только то, что программа завершилась неудачей, но и ПОЧЕМУ программа потерпела неудачу. Обычно это просто результат паршивого кодирования, не улавливающего все возможные результаты программы. В других случаях это просто жестко заданные пути к файлам. Без ограничений вы можете догадаться, что пошло не так, где и как. С помощью strace вы получаете разбивку системного вызова, обычно просто просмотр возвращаемого значения говорит вам о многом.
Профилирование - это еще одно применение. Вы можете использовать его для определения времени выполнения каждого системного вызова по отдельности или в виде совокупности. Хотя этого может быть недостаточно для решения ваших проблем, по крайней мере, это значительно сузит список потенциальных подозреваемых. Если вы видите много пар fopen / close в одном файле, вы, вероятно, без необходимости открываете и закрываете файлы при каждом выполнении цикла, вместо того, чтобы открывать и закрывать его вне цикла.
Ltrace - близкий родственник Strace, также очень полезный. Вы должны научиться различать, где находится ваше узкое место. Если общее выполнение составляет 8 секунд, и вы тратите только 0,05 сек на системные вызовы, то использование программы не принесет вам большой пользы, проблема в вашем коде, что обычно является проблемой логики, или программе действительно нужны чтобы так долго бежать.
Самая большая проблема с strace / ltrace - это чтение их вывода. Если вы не знаете, как выполняются вызовы или хотя бы имена системных вызовов / функций, будет сложно расшифровать смысл. Знание того, что возвращают функции, также может быть очень полезным, особенно для разных кодов ошибок. Хотя расшифровывать это очень сложно, иногда они действительно возвращают жемчужину знаний; как только я увидел ситуацию, когда у меня закончились inode, но не было свободного места, таким образом, все обычные утилиты не дали мне никакого предупреждения, я просто не смог создать новый файл. Чтение кода ошибки из вывода strace указало мне правильное направление.
источник
Strace - это инструмент, который сообщает вам, как ваше приложение взаимодействует с вашей операционной системой.
Он делает это, сообщая вам, какие системные вызовы использует ваша прикладная программа и с какими параметрами она их вызывает.
Например, вы видите, какие файлы пытается открыть ваша программа, и выдерживает ли вызов успешно.
Вы можете отлаживать все виды проблем с этим инструментом. Например, если приложение сообщает, что не может найти библиотеку, которую, как вы знаете, вы установили, вы сразу указали, где приложение ищет этот файл.
И это только верхушка айсберга.
источник
strace - хороший инструмент для изучения того, как ваша программа выполняет различные системные вызовы (запросы к ядру), а также сообщает о сбоях, а также о значении ошибки, связанной с этим сбоем. Не все сбои являются ошибками. Например, код, который пытается найти файл, может получить ошибку ENOENT (нет такого файла или каталога), но это может быть приемлемым сценарием в логике кода.
Один хороший пример использования strace - отладка состояния гонки во время создания временного файла. Например, программа, которая может создавать файлы путем добавления идентификатора процесса (PID) к некоторой предварительно определенной строке, может столкнуться с проблемами в многопоточных сценариях. [PID + TID (идентификатор процесса + идентификатор потока) или лучший системный вызов, такой как mkstemp, исправит это].
Это также хорошо для отладки сбоев. Вы можете найти эту (мою) статью о сбоях strace и отладке полезной.
источник
Минимальный исполняемый пример
Если концепция не ясна, есть более простой пример, который вы не видели, который объясняет это.
В данном случае этот пример - свободно распространяемая сборка Linux x86_64 (без libc):
hello.S
GitHub вверх по течению .
Собрать и запустить:
Выводит ожидаемое:
Теперь давайте используем strace на этом примере:
Мы используем:
env -i ASDF=qwer
для управления переменными среды: /unix/48994/how-to-run-a-program-in-a-clean-environment-in-bash-s999 -v
показывать более полную информацию в журналахstrace.log
теперь содержит:В таком минимальном примере каждый отдельный символ вывода очевиден:
execve
строка: показывает, какstrace
выполняетсяhello.out
, включая аргументы CLI и среду, как описано вman execve
write
строка: показывает системный вызов write, который мы сделали.6
это длина строки"hello\n"
.= 6
это возвращаемое значение системного вызова, которое, как задокументировано,man 2 write
является количеством записанных байтов.exit
строка: показывает системный вызов выхода, который мы сделали. Нет возвращаемого значения, так как программа вышла!Более сложные примеры
Применение strace, конечно, позволяет увидеть, какие системные вызовы на самом деле выполняют сложные программы, чтобы помочь отладить / оптимизировать вашу программу.
Примечательно, что большинство системных вызовов, с которыми вы можете столкнуться в Linux, имеют оболочки glibc, многие из них из POSIX .
Внутри оболочки glibc используют встроенную сборку более или менее так: Как вызвать системный вызов через sysenter во встроенной сборке?
Следующий пример, который вы должны изучить, - это
write
привет POSIX :main.c
Скомпилируйте и запустите:
На этот раз вы увидите, что glibc выполняет кучу системных вызовов,
main
чтобы настроить приятную среду для main.Это потому, что мы сейчас не используем отдельно стоящую программу, а скорее более распространенную программу glibc, которая обеспечивает функциональность libc.
Затем, на каждом конце,
strace.log
содержит:Итак, мы заключаем, что
write
функция POSIX использует, удивительно,write
системный вызов Linux .Мы также наблюдаем, что
return 0
приводит кexit_group
звонку вместоexit
. Ха, я не знал об этом! Вот почемуstrace
так круто.man exit_group
затем объясняет:А вот еще один пример, где я изучал, какой системный вызов
dlopen
использует: /unix/226524/what-system-call-is-used-to-load-libraries-in-linux/462710#462710Протестировано в Ubuntu 16.04, GCC 6.4.0, ядре Linux 4.4.0.
источник
Вот несколько примеров того, как я использую strace, чтобы копаться в сайтах. Надеюсь, это полезно.
Проверьте время до первого байта следующим образом:
Посмотрите, какой процент действий делает что. Многое
lstat
иfstat
может быть признаком того, что пришло время очистить кеш:Выводит,
trace.txt
чтобы вы могли точно видеть, какие звонки были сделаны.Используйте это , чтобы проверить , было ли что - нибудь между
.1
к.9
секунде к нагрузке:Посмотрите, какие недостающие файлы или каталоги попали в папку
strace
. Это выведет много вещей, связанных с нашей системой - единственные важные биты касаются файлов клиента:источник
Мне понравились некоторые ответы, где читается
strace
проверка того, как вы взаимодействуете с вашей операционной системой.Это именно то, что мы можем видеть. Система звонков. Если сравнивать
strace
иltrace
разница более очевидна.С другой стороны, есть
ltrace
то, что отслеживает функции.Хотя я проверил руководства несколько раз, я не нашел источника имени,
strace
но, скорее всего, это трассировка системных вызовов, поскольку это очевидно.Есть три больших примечания, чтобы сказать о
strace
.Примечание 1: обе эти функции
strace
иltrace
используют системный вызовptrace
. Так чтоptrace
системный вызов эффективноstrace
работает.Примечание 2: есть разные параметры, которые вы можете использовать
strace
, поскольку ониstrace
могут быть очень подробными. Мне нравится экспериментировать с-c
чем-то вроде резюме вещей. Исходя из этого-c
вы можете выбрать один системный вызов, например,-e trace=open
где вы увидите только этот вызов. Это может быть интересно, если вы изучаете, какие файлы будут открываться во время отслеживаемой вами команды. И, конечно, вы можете использоватьgrep
для той же цели, но обратите внимание, что вам нужно перенаправить, как это,2>&1 | grep etc
чтобы понять, что файлы конфигурации ссылаются, когда была выполнена команда.Примечание 3: я нахожу это очень важное примечание. Вы не ограничены конкретной архитектурой.
strace
поразит вас, так как он может проследить через двоичные файлы различных архитектур.источник