PTRACE(2)
НАЗВАНИЕ
ptrace - трассировка процесса
СИНТАКСИС
int ptrace (request, pid, addr, data)
int request, pid, addr, data;
ОПИСАНИЕ
Системный вызов ptrace предоставляет средства, используя которые родительский процесс может управлять выполнением порожденного процесса. В первую очередь этот вызов используется для реализации отладчиков с точками
прерывания [см. sdb(1)]. Порожденный процесс работает
обычным образом, пока он не получает сигнал [см. список
в signal(2)], после чего он приостанавливается, а его
родительский процесс получает информацию об этом через
wait(2). Пока порожденный процесс приостановлен, родительский процесс может читать и изменять образ его памяти, вызывая ptrace. Кроме того, родительский процесс
может либо уничтожить порожденный процесс, либо возобновить его выполнение, возможно удалив сигнал, вызвавший остановку.
Аргумент request определяет действия, которые должен
выполнить системный вызов ptrace. Возможны следующие
действия:
0
| Вызов с этим значением request должен быть сделан порожденным процессом, если предполагается его трассировка родительским процессом. Этот вызов устанавливает у порожденного процесса флаг трассировки, вследствии чего порожденный процесс при получении сигнала останавливается, не отрабатывая функции, указанной аргументом системного вызова signal [см. signal(2)]. Аргументы pid, addr, и data игнорируются и возвращаемое значение не определено. Если родительский процесс не собирается трассировать порожденный процесс, результаты будут непредсказуемыми. |
Вызовы с остальными значениями аргумента request могут использоваться только родительским процессом. Для всех этих вызовов аргумент pid обозначает идентификатор по рожденного процесса. Вызовы имеют смысл, только когда порожденный процесс приостановлен. |
1,2
| При этих значениях request родительскому процессу возвращается слово по адресу addr в адресном пространстве порожденного процесса. Оба значения request приводят к одинаковым результатам. Игнорируется аргумент data. |
3
| Родительскому процессу возвращается слово из структуры u типа user, находящейся в системном адресном пространстве [см. <sys/user.h>] и соответствующей порожденному процессу. Аргумент addr задает смещение слова относительно начала структуры. Аргумент data игнорируется. Вызов завершается неудачей, если указанное слово находится за преде лами этой структуры, в этом случае родительскому процессу возвращается -1, а переменной родительского процесса errno присваивается значение EIO. |
4,5
| При этих значениях request аргумент data записывается по адресу addr в адресном пространстве порожденного процесса. Оба значения request приводят к одинаковым результатам. При успешном завершении возвращается результат, равный записанному значению; в противном случае родительскому процессу возвращается -1, а переменной родительского процесса errno присваивается значение EIO. |
6
| Это значение аргумента request позволяет изменить некоторые поля в структуре u типа user, соответствующей порожденному процессу. Значение аргумента data записывается в слово, смещение которого от начала структуры u задается аргументом addr. Могут быть изменены лишь следующие компоненты:
- Регистры общего назначения.
- Признаки результата в слове состояния процессора.
Поле u_ar0 структуры u содержит адрес массива, в котором сохраняются регистры, как общего назначения, так и специальные. Чтобы вычислить смещение этого массива от начала структуры, нужно в файле /unix найти имя u, извлечь адрес структуры и затем вычесть его из значения поля u_ar0. Порядок расположения регистров в упомянутом массиве описан во включаемом файле <sys/reg.h>. |
7
| Вызов с этим значением request служит для возобновления работы порожденного процесса. Если аргумент data равен 0, то до возобновления работы удаляются все полученные, но не обработанные сигналы, включая тот, который вызвал приостановку порожденного процесса. Если аргумент data равен корректному номеру сигнала, то порожденный процесс возобновляет работу так, как будто он получил этот сигнал, а все остальные полученные сигналы удаляются. Аргумент addr задает адрес, с которого возобновляется выполнение порожденного процесса. Если значение addr равно 1, выполнение порожденного процесса возобновляется с места приостановки. При успешном завершении возвращается результат, равный значению аргумента data. Вызов завершается неудачей, если аргумент data не равен 0 или корректному номеру сигнала, в этом случае родительскому процессу возвращается -1, а переменной родительского процесса errno присваивается значение EIO. |
8
| Вызов с этим значением request приводит к уничтожению порожденного процесса с той же последовательностью действий, что и exit(2). |
9
| Вызов с этим значением request устанавливает бит трассировки в слове состояния процессора порожденного процесса и затем совершает действия, описанные для значения request, равного 7. Установленный бит трассировки вызывает прерывания по выполнению каждой машинной команды, что позволяет эффективно трассировать порожденный процесс по одной команде. |
Чтобы предупредить возможный обман, вызов ptrace подавляет возможность переустанавливать действующий идентификатор пользователя при последующих вызовах exec(2).
Если трассируемый процесс вызывает exec, то он до выполнения первой команды из нового выполняемого файла
останавливается, сообщая о получении сигнала SIGTRAP.
Системный вызов ptrace завершается неудачей, если выполнено хотя бы одно из следующих условий:
- [EIO]
- Некорректный параметр request.
- [ESRCH]
- Отсутствует порожденный процесс с идентификатором, равным pid, или он не вызывал
ptrace с параметром request, равным 0.
СМ. ТАКЖЕ
sdb(1), exec(2), exit(2), signal(2), wait(2).
|
|