В системе Linux взаимодействие процесса и оборудования осуществляется не напрямую, а через системный вызовосознать。
strace
это мощный инструмент,Он может отслеживать системный вызов, когда процесс выполняется и получен сигнал.,Это полезно для диагностики и отладки программ.
strace
Используется для отслеживания выполнения программысистемный вызов и Сигнал. В Linux процессы пользовательского режима должны проходить системный вызов для запроса служб состояния ядра,Например, файловые операции、сетевая связьждать。strace
Возможность фиксировать детали этих звонков,Включает имя, параметры и возвращаемое значение вызова.,и время, потраченное на выполнение этих вызовов.
системный вызов(System Call) — это интерфейс программ пользовательского пространства для взаимодействия с пространством ядра операционной системы. Из соображений безопасности и эффективности программы пользовательского пространства не могут напрямую обращаться к ресурсам пространства ядра, а через системный доступ. вызов для запроса ядра на предоставление услуг. системный Существует много типов вызовов,Охватывает файловые операции, управление процессом、сетевая связь、Сигнал регулирует многие другие аспекты.
open(): открыть файл. read(): прочитать данные из файла. write(): запись данных в файл. fork(): копировать процесс.
Сигнал (Signal) — программное прерывание.,Используется для уведомления процесса о произошедших определенных событиях. Сигнал может передавать информацию между пространством пользователя и пространством ядра.,Это простая форма межпроцессного взаимодействия (IPC).
SIGINT: Прерывание отправлено пользователем Сигнал,Обычно используется для завершения приоритетных процессов. SIGKILL: Немедленно завершить процесс.,Его невозможно игнорировать или поймать. SIGTERM: Прервать сигнал,Может быть захвачен процессом и выполнить работу по очистке.
Системный вызов и Сигнал — это механизмы взаимодействия процессов с ядром, но они служат разным целям:
В большинстве дистрибутивов Linux,strace
Можетпроходить Менеджер пакетов для легкой установки。Например,В системах на базе Debian, таких как Ubuntu,Его можно установить с помощью следующей команды:
sudo apt-get install strace
Основное использование заключается в следующем:
strace <command>
Это выведет<command>
осуществлятьв процессеизвсесистемный вызов。
strace
из Вывод каждой строкиповерхностьодинсистемный вызов,Включая имя системного вызова, параметры, возвращаемое значение и код ошибки.,Формат обычно следующий:
<syscall>(<arguments...>) = <return value>
<syscall>
дасистемный Имя вызова.<arguments...>
дапередача Даватьсистемный вызовизпараметр Списокповерхность。<return value>
дасистемный вызовизвозвращаемое значение,В случае успеха обычно0
,По ошибке это-1
,и установим глобальные переменныеerrno
。Пример:
open("/etc/passwd", O_RDONLY) = 3read(3, "root:x:0:0:root:/root:/bin/bash\nbin:x:1:1::/"..., 8192) = 8192close(3) = 0
open()
Функция пытается открыть файл,read()
Чтение данных из файла во время close()
Затем закройте дескриптор файла.
strace
Предоставляет разнообразныепараметрнастроить отслеживаниеиз Поведение:
-c: подсчитать каждый системный время выполнения вызова, количество раз и количество ошибок. -T: Отобразить каждый системный оцените потраченное время. -е трассировка=set: отслеживать только указанную систему набор вызовов, например -e трассировка = открыть, закрыть. -f: отслеживать дочерние процессы, созданные fork(). -о <file>:Перенаправить вывод в файл。-p <pid>:Отслеживание заданийизпроцессID。
Если вы хотите отслеживать уже запущенный процесс,Можно использовать-p
параметр Укажите процессID:
strace -p <pid>
Отслеживая системный вызов процесса, вы можете наблюдать последнее поведение процесса перед ненормальным завершением:
strace -p <pid> -o output.txt
системный, связанный с операциями с общей памятью вызовнравитьсяshmget
、shmat
、shmctl
ждать Можетпроходитьstrace
Последующие действия для устранения неполадок:
strace -e trace=ipc <command>
Когда дело доходит до сетевых проблем, можно специально отслеживать системные вызовы, связанные с сетью:
strace -e trace=network <command>
Отследить Полученный программой Сигнал можно:
strace -e signal=all <command>
использовать-c
параметр ХОРОШОсистемный вызов выполнил статистический анализ:
strace -c <command> > output.txt
Веб-сервер не может загрузить страницу должным образом. использовать strace
Могут быть обнаружены следующие ошибки:
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) = 3connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)
Это указывает на то, что соединение еще не завершено, возможно, из-за задержек в сети или неправильной конфигурации.
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
AF_INET
:обозначениеиспользоватьIPv4адрес семьи。SOCK_STREAM
:обозначениеиспользоватьориентированный на соединениеиз、надежныйизпотоковый сокет,Это типичная характеристика протокола TCP.IPPROTO_TCP
:яркий确обозначениеиспользоватьTCPкак протокол транспортного уровня。= 3
:поверхность Указывает на успешный вызов,И возвращается сокет с файловым дескриптором (FD) 3. Дескриптор файла — это целое число, используемое операционной системой для идентификации открытых файлов, сокетов и других ресурсов ввода-вывода.connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)
3
:этотда Создано ранееизрозеткаиздескриптор файла。sa_family=AF_INET
:обозначение了адрес семьидляIPv4。sin_port=htons(80)
:Номер целевого порта указывается как80,htons
Функция преобразует порядок байтов хостаиз Преобразование номера порта в сетевой порядок байтов。sin_addr=inet_addr("127.0.0.1")
:Цель указанаIPАдрес является локальным адресом обратной связи.,Это 127.0.0.1,Обычно используется для тестирования или подключения к локальным службам.16
:этотдаориентированныйsockaddr_in
структураизуказательиз Длина байта。connect
вызовизрезультатповерхностьяркий:
= -1
:поверхность Показыватьсистемный вызов возвратил ошибку.EINPROGRESS
:даодин特殊изошибкакод,Указывает, что операция подключения началась,Но это еще не сделано. Обычно это происходит с неблокирующими сокетами.,Или когда сокет установлен в неблокирующий режим.Когда сокет установлен в неблокирующий режим,connect
вызов不会使вызов它изпроцесс挂起,Вместо этого он немедленно возвращается. Если соединение выполняется,connect
Звонок вернетсяEINPROGRESS
ошибка。этотданормальныйиз网络действовать Поведение,Особенно, когда вам нужно одновременно обрабатывать несколько соединений или выполнять другие задачи.
Будьте правыиметь дело сEINPROGRESS
,Программы могут:
select
илиpoll
системный вызов для мониторинга состояния сокета, определяя, когда соединение установлено или попытка соединения не удалась.getsockopt
иSO_ERROR
选项来查询розеткаизошибкасостояние,чтобы определить, удалось ли соединение или нет.epoll
илиуправляемый событиямиизсетевая библиотека。strace
производительность системы может быть сниженапроизводитьопределенное влияние,Особенно в производственной среде.
На сервере Apache или Nginx с высоким трафиком в производственной среде.,Диагностика проблем с производительностью,использоватьstrace
来跟踪один长时间运行изпроцесс。потому чтоstrace
需要捕获всеизсистемный вызови Сигнал,Этот процесс может занять много ресурсов процессора.,Это влияет на производительность сервера. в этом случае,Вы можете заметить более медленное время ответа вашего сервера.,Обработка запросов замедляется.strace
измеханизм,Может изменить поведение или уйти.-o
параметр Перенаправить вывод в файлдаодин好из Привычка,Это позволяет избежать чрезмерного вывода, вызывающего слишком быструю прокрутку экрана. strace
даодин功能强大изинструмент,Может помочь нам глубже понять поведение программы,Проблема с позиционированием。проходить Разумныйиспользоватьstrace
изпараметр,Может эффективно уменьшить шум на выходе,Сосредоточьтесь на соответствующем системном вызове. Однако,Также помните о его потенциальном влиянии на производительность.,И при необходимости найдите альтернативные средства отладки.