Как работает strace? - PullRequest
       94

Как работает strace?

18 голосов
/ 31 марта 2011

Может отслеживать все системные вызовы.

Но чем отличается sys_call от обычного вызова ??

Ответы [ 3 ]

37 голосов
/ 13 июля 2011

Как сказал Мэтью, strace использует системный вызов ptrace (2) , чтобы творить свою магию.ptrace используется для реализации отладчиков и других инструментов, которые должны проверять, что делает другая программа.По сути, strace вызывает ptrace и присоединяется к целевому процессу.

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

В ответ на ваш второй вопрос системный вызов отличается от обычного вызова функции тем, что системный вызов реализован в ядре, а обычная функция реализована в пространстве пользователя.Это целая червячная банка.

9 голосов
/ 30 июня 2016

Я написал пост в блоге о том, как работает strace и еще более длинный пост в блоге о том, как работают системные вызовы .

strace работает с использованием системного вызова ptrace, который заставляет ядро ​​останавливать отслеживаемую программу при каждом входе или выходе из ядра через системный вызов. Программа трассировки (в данном случае strace) может затем проверить состояние программы, используя ptrace.

strace получает аргументы для каждого системного вызова в зависимости от того, как эта система работает. В системах x86-64 аргументы системных вызовов передаются в регистрах ЦП. В этом случае strace может вызвать ptrace с аргументом PTRACE_GETREGS, чтобы получить копию значений регистра и распечатать их.

1 голос
/ 31 марта 2011

Системные вызовы - это интерфейс между пользователем и пространством ядра. См. Список man 2 syscalls или syscalls.h .

Их не следует путать со стандартными функциями библиотеки C, такими как printf. Они часто заканчивают вызовом системного вызова, но не обязательно. Кроме того, программа пространства пользователя может вызывать системный вызов напрямую с помощью функции syscall .

...