2016-12-15 18:03:17 +03:00
|
|
|
.\" $NetBSD: ptrace.2,v 1.44 2016/12/15 15:03:17 kamil Exp $
|
1995-02-27 15:31:34 +03:00
|
|
|
.\"
|
1994-11-14 09:26:44 +03:00
|
|
|
.\" This file is in the public domain.
|
2016-11-01 18:30:47 +03:00
|
|
|
.Dd November 1, 2016
|
1994-11-14 09:26:44 +03:00
|
|
|
.Dt PTRACE 2
|
1999-03-22 22:44:33 +03:00
|
|
|
.Os
|
1994-11-14 09:26:44 +03:00
|
|
|
.Sh NAME
|
|
|
|
.Nm ptrace
|
|
|
|
.Nd process tracing and debugging
|
1999-12-03 00:42:35 +03:00
|
|
|
.Sh LIBRARY
|
|
|
|
.Lb libc
|
1994-11-14 09:26:44 +03:00
|
|
|
.Sh SYNOPSIS
|
2003-04-16 17:34:34 +04:00
|
|
|
.In sys/types.h
|
|
|
|
.In sys/ptrace.h
|
1994-11-14 09:26:44 +03:00
|
|
|
.Ft int
|
2007-03-06 19:07:22 +03:00
|
|
|
.Fn ptrace "int request" "pid_t pid" "void *addr" "int data"
|
1994-11-14 09:26:44 +03:00
|
|
|
.Sh DESCRIPTION
|
|
|
|
.Fn ptrace
|
2002-10-01 22:10:43 +04:00
|
|
|
provides tracing and debugging facilities.
|
|
|
|
It allows one process (the
|
1994-11-14 09:26:44 +03:00
|
|
|
.Em tracing
|
|
|
|
process) to control another (the
|
|
|
|
.Em traced
|
2002-10-01 22:10:43 +04:00
|
|
|
process).
|
|
|
|
Most of the time, the traced process runs normally, but when
|
1994-11-14 09:26:44 +03:00
|
|
|
it receives a signal
|
|
|
|
.Po
|
|
|
|
see
|
|
|
|
.Xr sigaction 2
|
|
|
|
.Pc ,
|
2002-10-01 22:10:43 +04:00
|
|
|
it stops.
|
|
|
|
The tracing process is expected to notice this via
|
1994-11-14 09:26:44 +03:00
|
|
|
.Xr wait 2
|
|
|
|
or the delivery of a
|
|
|
|
.Dv SIGCHLD
|
|
|
|
signal, examine the state of the stopped process, and cause it to
|
|
|
|
terminate or continue as appropriate.
|
|
|
|
.Fn ptrace
|
|
|
|
is the mechanism by which all this happens.
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fa request
|
|
|
|
argument specifies what operation is being performed; the meaning of
|
|
|
|
the rest of the arguments depends on the operation, but except for one
|
|
|
|
special case noted below, all
|
|
|
|
.Fn ptrace
|
|
|
|
calls are made by the tracing process, and the
|
|
|
|
.Fa pid
|
|
|
|
argument specifies the process ID of the traced process.
|
|
|
|
.Fa request
|
|
|
|
can be:
|
|
|
|
.Bl -tag -width 12n
|
|
|
|
.It Dv PT_TRACE_ME
|
|
|
|
This request is the only one used by the traced process; it declares
|
2002-10-01 22:10:43 +04:00
|
|
|
that the process expects to be traced by its parent.
|
|
|
|
All the other arguments are ignored.
|
|
|
|
(If the parent process does not expect to trace
|
1994-11-14 09:26:44 +03:00
|
|
|
the child, it will probably be rather confused by the results; once the
|
|
|
|
traced process stops, it cannot be made to continue except via
|
2001-09-16 06:13:26 +04:00
|
|
|
.Fn ptrace . )
|
1994-11-14 09:26:44 +03:00
|
|
|
When a process has used this request and calls
|
|
|
|
.Xr execve 2
|
|
|
|
or any of the routines built on it
|
|
|
|
.Po
|
|
|
|
such as
|
|
|
|
.Xr execv 3
|
|
|
|
.Pc ,
|
|
|
|
it will stop before executing the first instruction of the new image.
|
|
|
|
Also, any setuid or setgid bits on the executable being executed will
|
|
|
|
be ignored.
|
|
|
|
.It Dv PT_READ_I , Dv PT_READ_D
|
|
|
|
These requests read a single
|
|
|
|
.Li int
|
2002-10-01 22:10:43 +04:00
|
|
|
of data from the traced process' address space.
|
|
|
|
Traditionally,
|
1994-11-14 09:26:44 +03:00
|
|
|
.Fn ptrace
|
|
|
|
has allowed for machines with distinct address spaces for instruction
|
|
|
|
and data, which is why there are two requests: conceptually,
|
|
|
|
.Dv PT_READ_I
|
|
|
|
reads from the instruction space and
|
|
|
|
.Dv PT_READ_D
|
2002-10-01 22:10:43 +04:00
|
|
|
reads from the data space.
|
|
|
|
In the current
|
1998-02-06 08:39:31 +03:00
|
|
|
.Nx
|
|
|
|
implementation, these
|
2002-10-01 22:10:43 +04:00
|
|
|
two requests are completely identical.
|
|
|
|
The
|
1994-11-14 09:26:44 +03:00
|
|
|
.Fa addr
|
|
|
|
argument specifies the address (in the traced process' virtual address
|
2002-10-01 22:10:43 +04:00
|
|
|
space) at which the read is to be done.
|
|
|
|
This address does not have to meet any alignment constraints.
|
|
|
|
The value read is returned as the return value from
|
1994-11-14 09:26:44 +03:00
|
|
|
.Eo \&
|
|
|
|
.Fn ptrace
|
|
|
|
.Ec .
|
|
|
|
.It Dv PT_WRITE_I , Dv PT_WRITE_D
|
|
|
|
These requests parallel
|
|
|
|
.Dv PT_READ_I
|
|
|
|
and
|
|
|
|
.Dv PT_READ_D ,
|
2002-10-01 22:10:43 +04:00
|
|
|
except that they write rather than read.
|
|
|
|
The
|
1994-11-14 09:26:44 +03:00
|
|
|
.Fa data
|
|
|
|
argument supplies the value to be written.
|
|
|
|
.It Dv PT_CONTINUE
|
|
|
|
The traced process continues execution.
|
|
|
|
.Fa addr
|
|
|
|
is an address specifying the place where execution is to be resumed (a
|
|
|
|
new value for the program counter), or
|
2014-07-28 12:10:23 +04:00
|
|
|
.Li (void *)1
|
1994-11-14 09:26:44 +03:00
|
|
|
to indicate that execution is to pick up where it left off.
|
|
|
|
.Fa data
|
|
|
|
provides a signal number to be delivered to the traced process as it
|
2010-04-06 18:26:59 +04:00
|
|
|
resumes execution, or 0 if no signal is to be sent.
|
|
|
|
If a negative value is supplied, that is the negative of the LWP
|
|
|
|
ID of the thread to be resumed, and only that thread executes.
|
1994-11-14 09:26:44 +03:00
|
|
|
.It Dv PT_KILL
|
|
|
|
The traced process terminates, as if
|
|
|
|
.Dv PT_CONTINUE
|
|
|
|
had been used with
|
|
|
|
.Dv SIGKILL
|
|
|
|
given as the signal to be delivered.
|
|
|
|
.It Dv PT_ATTACH
|
|
|
|
This request allows a process to gain control of an otherwise unrelated
|
2002-10-01 22:10:43 +04:00
|
|
|
process and begin tracing it.
|
|
|
|
It does not need any cooperation from the to-be-traced process.
|
|
|
|
In this case,
|
1994-11-14 09:26:44 +03:00
|
|
|
.Fa pid
|
|
|
|
specifies the process ID of the to-be-traced process, and the other two
|
2002-10-01 22:10:43 +04:00
|
|
|
arguments are ignored.
|
|
|
|
This request requires that the target process
|
1994-11-14 09:26:44 +03:00
|
|
|
must have the same real UID as the tracing process, and that it must
|
2002-10-01 22:10:43 +04:00
|
|
|
not be executing a setuid or setgid executable.
|
|
|
|
(If the tracing process is running as root,
|
|
|
|
these restrictions do not apply.)
|
|
|
|
The tracing process will see the newly-traced process stop and may then
|
1994-11-14 09:26:44 +03:00
|
|
|
control it as if it had been traced all along.
|
1999-03-27 02:37:27 +03:00
|
|
|
.Pp
|
2000-09-24 11:34:15 +04:00
|
|
|
Three other restrictions apply to all tracing processes, even those
|
2002-10-01 22:10:43 +04:00
|
|
|
running as root.
|
|
|
|
First, no process may trace a system process.
|
2000-09-24 11:34:15 +04:00
|
|
|
Second, no process may trace the process running
|
1999-03-27 02:37:27 +03:00
|
|
|
.Xr init 8 .
|
2000-09-24 11:34:15 +04:00
|
|
|
Third, if a process has its root directory set with
|
1999-03-27 02:37:27 +03:00
|
|
|
.Xr chroot 2 ,
|
|
|
|
it may not trace another process unless that process's root directory
|
|
|
|
is at or below the tracing process's root.
|
1994-11-14 09:26:44 +03:00
|
|
|
.It Dv PT_DETACH
|
2000-07-28 01:40:09 +04:00
|
|
|
This request is like PT_CONTINUE, except that after it
|
1994-11-14 09:26:44 +03:00
|
|
|
succeeds, the traced process is no longer traced and continues
|
|
|
|
execution normally.
|
2002-03-17 20:14:58 +03:00
|
|
|
.It Dv PT_IO
|
|
|
|
This request is a more general interface that can be used instead of
|
|
|
|
.Dv PT_READ_D ,
|
|
|
|
.Dv PT_WRITE_D ,
|
|
|
|
.Dv PT_READ_I ,
|
|
|
|
and
|
|
|
|
.Dv PT_WRITE_I .
|
|
|
|
The I/O request is encoded in a
|
|
|
|
.Dq Li "struct ptrace_io_desc"
|
|
|
|
defined as:
|
2003-06-26 13:50:49 +04:00
|
|
|
.Bd -literal -offset indent
|
2002-03-17 20:14:58 +03:00
|
|
|
struct ptrace_io_desc {
|
|
|
|
int piod_op;
|
|
|
|
void *piod_offs;
|
|
|
|
void *piod_addr;
|
|
|
|
size_t piod_len;
|
|
|
|
};
|
|
|
|
.Ed
|
|
|
|
.Pp
|
|
|
|
where
|
|
|
|
.Fa piod_offs
|
|
|
|
is the offset within the traced process where the I/O operation should
|
|
|
|
take place,
|
|
|
|
.Fa piod_addr
|
|
|
|
is the buffer in the tracing process, and
|
|
|
|
.Fa piod_len
|
2002-10-01 22:10:43 +04:00
|
|
|
is the length of the I/O request.
|
|
|
|
The
|
2002-03-17 20:14:58 +03:00
|
|
|
.Fa piod_op
|
2002-10-01 22:10:43 +04:00
|
|
|
field specifies which type of I/O operation to perform.
|
2010-04-14 12:57:21 +04:00
|
|
|
Possible values are:
|
|
|
|
.Pp
|
|
|
|
.Bl -tag -width 18n -offset indent -compact
|
2006-03-11 15:03:03 +03:00
|
|
|
.It Dv PIOD_READ_D
|
|
|
|
.It Dv PIOD_WRITE_D
|
|
|
|
.It Dv PIOD_READ_I
|
|
|
|
.It Dv PIOD_WRITE_I
|
2015-07-02 06:50:21 +03:00
|
|
|
.It Dv PIOD_READ_AUXV
|
2002-03-17 20:14:58 +03:00
|
|
|
.El
|
|
|
|
.Pp
|
|
|
|
See the description of
|
|
|
|
.Dv PT_READ_I
|
|
|
|
for the difference between I and D spaces.
|
2015-07-02 06:50:21 +03:00
|
|
|
The
|
|
|
|
.Dv PIOD_READ_AUXV
|
|
|
|
operation can be used to read from the ELF auxiliary vector.
|
2002-03-17 20:14:58 +03:00
|
|
|
A pointer to the I/O descriptor is passed in the
|
|
|
|
.Fa addr
|
|
|
|
argument to
|
|
|
|
.Fn ptrace .
|
|
|
|
On return, the
|
|
|
|
.Fa piod_len
|
|
|
|
field in the I/O descriptor will be updated with the actual number of
|
2002-10-01 22:10:43 +04:00
|
|
|
bytes transferred.
|
|
|
|
If the requested I/O could not be successfully performed,
|
2002-03-17 20:14:58 +03:00
|
|
|
.Fn ptrace
|
|
|
|
will return
|
2004-05-13 14:20:57 +04:00
|
|
|
.Li \-1
|
2002-03-17 20:14:58 +03:00
|
|
|
and set
|
|
|
|
.Va errno .
|
2006-03-11 15:03:03 +03:00
|
|
|
.It Dv PT_DUMPCORE
|
2006-03-06 18:47:42 +03:00
|
|
|
Makes the process specified in the
|
|
|
|
.Fa pid
|
|
|
|
pid generate a core dump.
|
2006-03-11 15:03:03 +03:00
|
|
|
The
|
2006-03-06 18:47:42 +03:00
|
|
|
.Fa addr
|
|
|
|
argument should contain the name of the core file to be generated
|
|
|
|
and the
|
|
|
|
.Fa data
|
|
|
|
argument should contain the length of the core filename.
|
2006-03-11 15:03:03 +03:00
|
|
|
.It Dv PT_LWPINFO
|
2010-04-06 17:50:22 +04:00
|
|
|
Returns information about a thread from the list of threads for the
|
|
|
|
process specified in the
|
2006-03-06 18:47:42 +03:00
|
|
|
.Fa pid
|
|
|
|
argument.
|
|
|
|
The
|
|
|
|
.Fa addr
|
|
|
|
argument should contain a
|
|
|
|
.Dq Li "struct ptrace_lwpinfo"
|
|
|
|
defined as:
|
|
|
|
.Bd -literal -offset indent
|
2007-03-12 15:50:42 +03:00
|
|
|
struct ptrace_lwpinfo {
|
2006-03-06 18:47:42 +03:00
|
|
|
lwpid_t pl_lwpid;
|
|
|
|
int pl_event;
|
|
|
|
};
|
|
|
|
.Ed
|
|
|
|
.Pp
|
2006-03-11 15:03:03 +03:00
|
|
|
where
|
2006-03-06 18:47:42 +03:00
|
|
|
.Fa pl_lwpid
|
2010-04-06 18:26:59 +04:00
|
|
|
contains a thread LWP ID.
|
|
|
|
Information is returned for the thread following the one with the
|
|
|
|
specified ID in the process thread list, or for the first thread
|
|
|
|
if
|
2010-04-06 17:50:22 +04:00
|
|
|
.Fa pl_lwpid
|
|
|
|
is 0.
|
2006-03-06 18:47:42 +03:00
|
|
|
Upon return
|
2010-04-06 17:50:22 +04:00
|
|
|
.Fa pl_lwpid
|
|
|
|
contains the LWP ID of the thread that was found, or 0 if there is
|
|
|
|
no thread after the one whose LWP ID was supplied in the call.
|
2006-03-06 18:47:42 +03:00
|
|
|
.Fa pl_event
|
|
|
|
contains the event that stopped the thread.
|
2010-04-14 12:57:21 +04:00
|
|
|
Possible values are:
|
|
|
|
.Pp
|
|
|
|
.Bl -tag -width 30n -offset indent -compact
|
2006-03-06 18:47:42 +03:00
|
|
|
.It Dv PL_EVENT_NONE
|
|
|
|
.It Dv PL_EVENT_SIGNAL
|
|
|
|
.El
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fa data
|
|
|
|
argument should contain
|
|
|
|
.Dq Li "sizeof(struct ptrace_lwpinfo)" .
|
2006-03-11 15:03:03 +03:00
|
|
|
.It Dv PT_SYSCALL
|
2006-03-06 18:47:42 +03:00
|
|
|
Stops a process before and after executing each system call.
|
2011-09-01 03:04:33 +04:00
|
|
|
.It Dv PT_SYSCALLEMU
|
|
|
|
Intercept and ignore a system call before it has been executed, for use with
|
|
|
|
.Dv PT_SYSCALL .
|
2016-11-01 16:51:13 +03:00
|
|
|
.It Dv PT_SET_EVENT_MASK
|
|
|
|
This request can be used to specify which events in the traced process
|
|
|
|
should be reported to the tracing process.
|
|
|
|
These events are specified in a
|
|
|
|
.Dq Li "struct ptrace_event"
|
|
|
|
defined as:
|
|
|
|
.Bd -literal -offset indent
|
|
|
|
typedef struct ptrace_event {
|
|
|
|
int pe_set_event;
|
|
|
|
} ptrace_event_t;
|
|
|
|
.Ed
|
|
|
|
.Pp
|
|
|
|
Where
|
|
|
|
.Fa pe_set_event
|
|
|
|
is the set of events to be reported.
|
|
|
|
This set is formed by OR'ing together the following values:
|
|
|
|
.Bl -tag -width 18n
|
|
|
|
.It PTRACE_FORK
|
|
|
|
Report
|
|
|
|
.Xr fork 2 .
|
|
|
|
.El
|
|
|
|
.Pp
|
|
|
|
A pointer to this structure is passed in
|
|
|
|
.Fa addr .
|
|
|
|
The
|
|
|
|
.Fa data
|
|
|
|
argument should be set to
|
|
|
|
.Li sizeof(struct ptrace_event) .
|
|
|
|
.It Dv PT_GET_EVENT_MASK
|
|
|
|
This request can be used to determine which events in the traced
|
|
|
|
process will be reported.
|
|
|
|
The information is read into the
|
|
|
|
.Dq Li struct ptrace_event
|
|
|
|
pointed to by
|
|
|
|
.Fa addr .
|
|
|
|
The
|
|
|
|
.Fa data
|
|
|
|
argument should be set to
|
|
|
|
.Li sizeof(struct ptrace_event) .
|
|
|
|
.It Dv PT_GET_PROCESS_STATE
|
|
|
|
This request reads the state information associated with the event
|
|
|
|
that stopped the traced process.
|
|
|
|
The information is reported in a
|
|
|
|
.Dq Li "struct ptrace_state"
|
|
|
|
defined as:
|
|
|
|
.Bd -literal -offset indent
|
|
|
|
typedef struct ptrace_state {
|
|
|
|
int pe_report_event;
|
|
|
|
pid_t pe_other_pid;
|
|
|
|
} ptrace_state_t;
|
|
|
|
.Ed
|
1994-11-14 09:26:44 +03:00
|
|
|
.El
|
|
|
|
.Pp
|
2001-09-16 05:38:59 +04:00
|
|
|
Additionally, the following requests exist but are
|
2003-03-31 07:05:43 +04:00
|
|
|
not available on all machine architectures.
|
2002-10-01 22:10:43 +04:00
|
|
|
The file
|
2010-03-22 22:30:53 +03:00
|
|
|
.In machine/ptrace.h
|
2000-09-28 02:31:43 +04:00
|
|
|
lists which requests exist on a given machine.
|
1994-11-14 09:26:44 +03:00
|
|
|
.Bl -tag -width 12n
|
2000-09-28 02:31:43 +04:00
|
|
|
.It Dv PT_STEP
|
|
|
|
Execution continues as in request PT_CONTINUE; however
|
|
|
|
as soon as possible after execution of at least one
|
|
|
|
instruction, execution stops again.
|
2010-04-06 17:50:22 +04:00
|
|
|
If the
|
|
|
|
.Fa data
|
|
|
|
argument is greater than 0, it contains the LWP ID of the thread to be
|
2010-04-06 18:26:59 +04:00
|
|
|
stepped, and any other threads are continued.
|
|
|
|
If the
|
2010-04-06 17:50:22 +04:00
|
|
|
.Fa data
|
|
|
|
argument is less than zero, it contains the negative of the LWP ID of
|
2010-04-06 18:26:59 +04:00
|
|
|
the thread to be stepped, and only that thread executes.
|
1994-11-14 09:26:44 +03:00
|
|
|
.It Dv PT_GETREGS
|
|
|
|
This request reads the traced process' machine registers into the
|
|
|
|
.Dq Li "struct reg"
|
|
|
|
(defined in
|
2010-03-22 22:30:53 +03:00
|
|
|
.In machine/reg.h )
|
1994-11-14 09:26:44 +03:00
|
|
|
pointed to by
|
|
|
|
.Fa addr .
|
2010-04-06 18:26:59 +04:00
|
|
|
The
|
2010-04-06 17:50:22 +04:00
|
|
|
.Fa data
|
|
|
|
argument contains the LWP ID of the thread whose registers are to
|
2010-04-06 18:26:59 +04:00
|
|
|
be read.
|
|
|
|
If zero is supplied, the first thread of the process is read.
|
1994-11-14 09:26:44 +03:00
|
|
|
.It Dv PT_SETREGS
|
|
|
|
This request is the converse of
|
|
|
|
.Dv PT_GETREGS ;
|
|
|
|
it loads the traced process' machine registers from the
|
|
|
|
.Dq Li "struct reg"
|
|
|
|
(defined in
|
2010-03-22 22:30:53 +03:00
|
|
|
.In machine/reg.h )
|
1994-11-14 09:26:44 +03:00
|
|
|
pointed to by
|
|
|
|
.Fa addr .
|
2010-04-06 18:26:59 +04:00
|
|
|
The
|
2010-04-06 17:50:22 +04:00
|
|
|
.Fa data
|
|
|
|
argument contains the LWP ID of the thread whose registers are to
|
2010-04-06 18:26:59 +04:00
|
|
|
be written.
|
|
|
|
If zero is supplied, the first thread of the process is written.
|
1994-11-14 09:26:44 +03:00
|
|
|
.It Dv PT_GETFPREGS
|
|
|
|
This request reads the traced process' floating-point registers into
|
|
|
|
the
|
|
|
|
.Dq Li "struct fpreg"
|
|
|
|
(defined in
|
2010-03-22 22:30:53 +03:00
|
|
|
.In machine/reg.h )
|
1994-11-14 09:26:44 +03:00
|
|
|
pointed to by
|
|
|
|
.Fa addr .
|
2010-04-06 18:26:59 +04:00
|
|
|
The
|
2010-04-06 17:50:22 +04:00
|
|
|
.Fa data
|
|
|
|
argument contains the LWP ID of the thread whose registers are to
|
2010-04-06 18:26:59 +04:00
|
|
|
be read.
|
|
|
|
If zero is supplied, the first thread of the process is read.
|
1994-11-14 09:26:44 +03:00
|
|
|
.It Dv PT_SETFPREGS
|
|
|
|
This request is the converse of
|
|
|
|
.Dv PT_GETFPREGS ;
|
|
|
|
it loads the traced process' floating-point registers from the
|
|
|
|
.Dq Li "struct fpreg"
|
|
|
|
(defined in
|
2010-03-22 22:30:53 +03:00
|
|
|
.In machine/reg.h )
|
1994-11-14 09:26:44 +03:00
|
|
|
pointed to by
|
|
|
|
.Fa addr .
|
2010-04-06 18:26:59 +04:00
|
|
|
The
|
2010-04-06 17:50:22 +04:00
|
|
|
.Fa data
|
|
|
|
argument contains the LWP ID of the thread whose registers are to
|
2010-04-06 18:26:59 +04:00
|
|
|
be written.
|
|
|
|
If zero is supplied, the first thread of the process is written.
|
2016-12-15 17:49:46 +03:00
|
|
|
.It Dv PT_GETXMMREGS
|
|
|
|
This request reads the traced process' XMM registers into
|
|
|
|
the
|
|
|
|
.Dq Li "struct xmmregs"
|
|
|
|
(defined in
|
|
|
|
.In machine/reg.h )
|
|
|
|
pointed to by
|
|
|
|
.Fa addr .
|
|
|
|
The
|
|
|
|
.Fa data
|
|
|
|
argument contains the LWP ID of the thread whose registers are to
|
|
|
|
be read.
|
|
|
|
If zero is supplied, the first thread of the process is read.
|
|
|
|
.It Dv PT_SETXMMREGS
|
|
|
|
This request is the converse of
|
|
|
|
.Dv PT_GETXMMREGS ;
|
|
|
|
it loads the traced process' XMM registers from the
|
|
|
|
.Dq Li "struct xmmregs"
|
|
|
|
(defined in
|
|
|
|
.In machine/reg.h )
|
|
|
|
pointed to by
|
|
|
|
.Fa addr .
|
|
|
|
The
|
|
|
|
.Fa data
|
|
|
|
argument contains the LWP ID of the thread whose registers are to
|
|
|
|
be written.
|
|
|
|
If zero is supplied, the first thread of the process is written.
|
2016-12-15 18:03:17 +03:00
|
|
|
.It Dv PT_GETVECREGS
|
|
|
|
This request reads the traced process' vector registers into
|
|
|
|
the
|
|
|
|
.Dq Li "struct vreg"
|
|
|
|
(defined in
|
|
|
|
.In machine/reg.h )
|
|
|
|
pointed to by
|
|
|
|
.Fa addr .
|
|
|
|
The
|
|
|
|
.Fa data
|
|
|
|
argument contains the LWP ID of the thread whose registers are to
|
|
|
|
be read.
|
|
|
|
If zero is supplied, the first thread of the process is read.
|
|
|
|
.It Dv PT_SETVECREGS
|
|
|
|
This request is the converse of
|
|
|
|
.Dv PT_GETVECREGS ;
|
|
|
|
it loads the traced process' vector registers from the
|
|
|
|
.Dq Li "struct vreg"
|
|
|
|
(defined in
|
|
|
|
.In machine/reg.h )
|
|
|
|
pointed to by
|
|
|
|
.Fa addr .
|
|
|
|
The
|
|
|
|
.Fa data
|
|
|
|
argument contains the LWP ID of the thread whose registers are to
|
|
|
|
be written.
|
|
|
|
If zero is supplied, the first thread of the process is written.
|
1994-11-14 09:26:44 +03:00
|
|
|
.El
|
|
|
|
.Sh ERRORS
|
|
|
|
Some requests can cause
|
|
|
|
.Fn ptrace
|
|
|
|
to return
|
2004-05-13 14:20:57 +04:00
|
|
|
.Li \-1
|
1994-11-14 09:26:44 +03:00
|
|
|
as a non-error value; to disambiguate,
|
|
|
|
.Va errno
|
2002-10-01 22:10:43 +04:00
|
|
|
can be set to 0 before the call and checked afterwards.
|
|
|
|
The possible errors are:
|
2010-04-14 12:57:21 +04:00
|
|
|
.Bl -tag -width "[EINVAL]"
|
2002-01-12 00:17:30 +03:00
|
|
|
.It Bq Er EAGAIN
|
|
|
|
Process is currently exec'ing and cannot be traced.
|
2010-04-06 18:26:59 +04:00
|
|
|
.It Bq Er EBUSY
|
|
|
|
.Bl -bullet -compact
|
|
|
|
.It
|
|
|
|
.Dv PT_ATTACH
|
|
|
|
was attempted on a process that was already being traced.
|
|
|
|
.It
|
|
|
|
A request attempted to manipulate a process that was being traced by
|
|
|
|
some process other than the one making the request.
|
|
|
|
.It
|
|
|
|
A request (other than
|
|
|
|
.Dv PT_ATTACH )
|
|
|
|
specified a process that wasn't stopped.
|
|
|
|
.El
|
1994-11-14 09:26:44 +03:00
|
|
|
.It Bq Er EINVAL
|
|
|
|
.Bl -bullet -compact
|
|
|
|
.It
|
|
|
|
A process attempted to use
|
|
|
|
.Dv PT_ATTACH
|
|
|
|
on itself.
|
|
|
|
.It
|
|
|
|
The
|
|
|
|
.Fa request
|
2000-09-28 02:31:43 +04:00
|
|
|
was not a legal request on this machine architecture.
|
1994-11-14 09:26:44 +03:00
|
|
|
.It
|
|
|
|
The signal number (in
|
|
|
|
.Fa data )
|
|
|
|
to
|
|
|
|
.Dv PT_CONTINUE
|
|
|
|
was neither 0 nor a legal signal number.
|
|
|
|
.It
|
|
|
|
.Dv PT_GETREGS ,
|
|
|
|
.Dv PT_SETREGS ,
|
|
|
|
.Dv PT_GETFPREGS ,
|
|
|
|
or
|
|
|
|
.Dv PT_SETFPREGS
|
2002-10-01 22:10:43 +04:00
|
|
|
was attempted on a process with no valid register set.
|
|
|
|
(This is normally true only of system processes.)
|
1994-11-14 09:26:44 +03:00
|
|
|
.El
|
|
|
|
.It Bq Er EPERM
|
|
|
|
.Bl -bullet -compact
|
|
|
|
.It
|
|
|
|
A request (other than
|
|
|
|
.Dv PT_ATTACH )
|
|
|
|
attempted to manipulate a process that wasn't being traced at all.
|
|
|
|
.It
|
|
|
|
An attempt was made to use
|
|
|
|
.Dv PT_ATTACH
|
|
|
|
on a process in violation of the requirements listed under
|
|
|
|
.Dv PT_ATTACH
|
|
|
|
above.
|
|
|
|
.El
|
2010-04-06 18:26:59 +04:00
|
|
|
.It Bq Er ESRCH
|
|
|
|
No process having the specified process ID exists.
|
1999-03-09 06:58:14 +03:00
|
|
|
.El
|
1999-10-06 21:14:55 +04:00
|
|
|
.Sh SEE ALSO
|
|
|
|
.Xr sigaction 2 ,
|
|
|
|
.Xr signal 7
|
1994-11-14 09:26:44 +03:00
|
|
|
.Sh BUGS
|
|
|
|
On the SPARC, the PC is set to the provided PC value for
|
|
|
|
.Dv PT_CONTINUE
|
2002-10-01 22:10:43 +04:00
|
|
|
and similar calls,
|
|
|
|
but the NPC is set willy-nilly to 4 greater than the PC value.
|
|
|
|
Using
|
1994-11-14 09:26:44 +03:00
|
|
|
.Dv PT_GETREGS
|
|
|
|
and
|
|
|
|
.Dv PT_SETREGS
|
|
|
|
to modify the PC, passing
|
2014-07-28 12:10:23 +04:00
|
|
|
.Li (void *)1
|
1994-11-14 09:26:44 +03:00
|
|
|
to
|
|
|
|
.Eo \&
|
|
|
|
.Fn ptrace
|
|
|
|
.Ec ,
|
|
|
|
should be able to sidestep this.
|