232 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
			
		
		
	
	
			232 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
.\" Copyright (c) 1980 Regents of the University of California.
 | 
						|
.\" All rights reserved.  The Berkeley software License Agreement
 | 
						|
.\" specifies the terms and conditions for redistribution.
 | 
						|
.\"
 | 
						|
.\"	@(#)ptrace.2	6.4 (Berkeley) 5/23/86
 | 
						|
.\"
 | 
						|
.TH PTRACE 2 "May 23, 1986"
 | 
						|
.UC 4
 | 
						|
.SH NAME
 | 
						|
ptrace \- process trace
 | 
						|
.SH SYNOPSIS
 | 
						|
.nf
 | 
						|
.ft B
 | 
						|
#include <sys/types.h>
 | 
						|
#include <sys/signal.h>
 | 
						|
#include <sys/ptrace.h>
 | 
						|
 | 
						|
int ptrace(int \fIrequest\fP, pid_t \fIpid\fP, long \fIaddr\fP, long \fIdata\fP)
 | 
						|
.ft R
 | 
						|
.fi
 | 
						|
.SH DESCRIPTION
 | 
						|
.ft B
 | 
						|
Note: This manual page has no relation to Minix.  Someone who knows ptrace()
 | 
						|
has to check, or rewrite, this page.  (kjb)
 | 
						|
.ft R
 | 
						|
.PP
 | 
						|
.B Ptrace
 | 
						|
provides a means by which a parent process
 | 
						|
may control the execution of a child process,
 | 
						|
and examine and change its core image.
 | 
						|
Its primary use is for the implementation of breakpoint debugging.
 | 
						|
There are four arguments whose interpretation
 | 
						|
depends on a
 | 
						|
.I request
 | 
						|
argument.
 | 
						|
Generally,
 | 
						|
.I pid
 | 
						|
is the process ID of the traced process,
 | 
						|
which must be a child (no more distant descendant)
 | 
						|
of the tracing process.
 | 
						|
A process being traced
 | 
						|
behaves normally until it encounters some signal
 | 
						|
whether internally generated
 | 
						|
like \*(lqillegal instruction\*(rq or externally
 | 
						|
generated like \*(lqinterrupt\*(rq.
 | 
						|
See
 | 
						|
.BR sigaction (2)
 | 
						|
for the list.
 | 
						|
Then the traced process enters a stopped state
 | 
						|
and its parent is notified via
 | 
						|
.BR  wait (2).
 | 
						|
When the child is in the stopped state,
 | 
						|
its core image can be examined and modified
 | 
						|
using
 | 
						|
.BR ptrace .
 | 
						|
If desired, another
 | 
						|
.B ptrace
 | 
						|
request can then cause the child either to terminate
 | 
						|
or to continue, possibly ignoring the signal.
 | 
						|
.PP
 | 
						|
The value of the
 | 
						|
.I request
 | 
						|
argument determines the precise
 | 
						|
action of the call:
 | 
						|
.TP 4
 | 
						|
PT_TRACE_ME
 | 
						|
This request is the only one used by the child process;
 | 
						|
it declares that the process is to be traced by its parent.
 | 
						|
All the other arguments are ignored.
 | 
						|
Peculiar results will ensue
 | 
						|
if the parent does not expect to trace the child.
 | 
						|
.TP 4
 | 
						|
PT_READ_I, PT_READ_D
 | 
						|
The
 | 
						|
word in the child process's address space
 | 
						|
at
 | 
						|
.I addr
 | 
						|
is returned.
 | 
						|
If I and D space are separated (e.g. historically
 | 
						|
on a pdp-11), request PT_READ_I indicates I space,
 | 
						|
PT_READ_D D space.
 | 
						|
.I Addr
 | 
						|
must be even on some machines.
 | 
						|
The child must be stopped.
 | 
						|
The input
 | 
						|
.I data
 | 
						|
is ignored.
 | 
						|
.TP 4
 | 
						|
PT_READ_U
 | 
						|
The word
 | 
						|
of the system's per-process data area corresponding to
 | 
						|
.I addr
 | 
						|
is returned.
 | 
						|
.I Addr
 | 
						|
must be even on some machines and less than 512.
 | 
						|
This space contains the registers and other information about
 | 
						|
the process;
 | 
						|
its layout corresponds to the
 | 
						|
.I user
 | 
						|
structure in the system.
 | 
						|
.TP 4
 | 
						|
PT_WRITE_I, PT_WRITE_D
 | 
						|
The
 | 
						|
given
 | 
						|
.I data
 | 
						|
is written at the word in the process's address space corresponding to
 | 
						|
.I addr,
 | 
						|
which must be even on some machines.
 | 
						|
No useful value is returned.
 | 
						|
If I and D space are separated, request PT_WRITE_I indicates I space, 
 | 
						|
PT_WRITE_D D space.
 | 
						|
Attempts to write in pure procedure
 | 
						|
fail if another process is executing the same file.
 | 
						|
.TP 4
 | 
						|
PT_WRITE_U
 | 
						|
The process's system data is written,
 | 
						|
as it is read with request PT_READ_U.
 | 
						|
Only a few locations can be written in this way:
 | 
						|
the general registers,
 | 
						|
the floating point status and registers,
 | 
						|
and certain bits of the processor status word.
 | 
						|
.TP 4
 | 
						|
PT_CONTINUE
 | 
						|
The
 | 
						|
.I data
 | 
						|
argument is taken as a signal number
 | 
						|
and the child's execution continues
 | 
						|
at location
 | 
						|
.I addr
 | 
						|
as if it had incurred that signal.
 | 
						|
Normally the signal number will be
 | 
						|
either 0 to indicate that the signal that caused the stop
 | 
						|
should be ignored,
 | 
						|
or that value fetched out of the
 | 
						|
process's image indicating which signal caused
 | 
						|
the stop.
 | 
						|
If
 | 
						|
.I addr
 | 
						|
is (int *)1 then execution continues from where it stopped.
 | 
						|
.TP 4
 | 
						|
PT_KILL
 | 
						|
The traced process terminates.
 | 
						|
.TP 4
 | 
						|
PT_STEP
 | 
						|
Execution continues as in request PT_CONTINUE;
 | 
						|
however, as soon as possible after execution of at least one instruction,
 | 
						|
execution stops again.
 | 
						|
The signal number from the stop is
 | 
						|
SIGTRAP.
 | 
						|
(On the VAX-11 the T-bit is used and just one instruction
 | 
						|
is executed.)
 | 
						|
This is part of the mechanism for implementing breakpoints.
 | 
						|
.PP
 | 
						|
As indicated,
 | 
						|
these calls
 | 
						|
(except for request PT_TRACE_ME)
 | 
						|
can be used only when the subject process has stopped.
 | 
						|
The
 | 
						|
.B wait
 | 
						|
call is used to determine
 | 
						|
when a process stops;
 | 
						|
in such a case the \*(lqtermination\*(rq status
 | 
						|
returned by
 | 
						|
.B wait
 | 
						|
has the value 0177 to indicate stoppage rather
 | 
						|
than genuine termination.
 | 
						|
.PP
 | 
						|
To forestall possible fraud,
 | 
						|
.B ptrace
 | 
						|
inhibits the set-user-id and set-group-id facilities
 | 
						|
on subsequent
 | 
						|
.BR  execve (2)
 | 
						|
calls.
 | 
						|
If a traced process calls
 | 
						|
.BR execve ,
 | 
						|
it will stop before executing the first instruction of the new image
 | 
						|
showing signal SIGTRAP.
 | 
						|
.PP
 | 
						|
On a VAX-11, \*(lqword\*(rq also means a 32-bit integer,
 | 
						|
but the \*(lqeven\*(rq
 | 
						|
restriction does not apply.
 | 
						|
.SH "RETURN VALUE
 | 
						|
A 0 value is returned if the call succeeds.  If the call fails
 | 
						|
then a \-1 is returned and the global variable \fIerrno\fP is
 | 
						|
set to indicate the error.
 | 
						|
.SH "ERRORS
 | 
						|
.TP 15
 | 
						|
[EIO]
 | 
						|
The request code is invalid.
 | 
						|
.TP 15
 | 
						|
[ESRCH]
 | 
						|
The specified process does not exist.
 | 
						|
.TP 15
 | 
						|
[EIO]
 | 
						|
The given signal number is invalid.
 | 
						|
.TP 15
 | 
						|
[EIO]
 | 
						|
The specified address is out of bounds.
 | 
						|
.TP 15
 | 
						|
[EPERM]
 | 
						|
The specified process cannot be traced.
 | 
						|
.SH "SEE ALSO"
 | 
						|
.BR wait (2),
 | 
						|
.BR sigaction (2),
 | 
						|
.BR mdb (1).
 | 
						|
.SH BUGS
 | 
						|
.B Ptrace
 | 
						|
is unique and arcane; it should be replaced with a special file that
 | 
						|
can be opened and read and written.  The control functions could then
 | 
						|
be implemented with
 | 
						|
.BR ioctl (2)
 | 
						|
calls on this file.  This would be simpler to understand and have much
 | 
						|
higher performance.
 | 
						|
.PP
 | 
						|
The request PT_TRACE_ME call should be able to specify
 | 
						|
signals that are to be treated normally and not cause a stop.
 | 
						|
In this way, for example,
 | 
						|
programs with simulated floating point (which
 | 
						|
use \*(lqillegal instruction\*(rq signals at a very high rate)
 | 
						|
could be efficiently debugged.
 | 
						|
.PP
 | 
						|
The error indication, \-1, is a legitimate function value;
 | 
						|
.BR errno ,
 | 
						|
(see
 | 
						|
.BR intro (2)),
 | 
						|
can be used to disambiguate.
 | 
						|
.PP
 | 
						|
It should be possible to stop a process on occurrence of a system
 | 
						|
call;
 | 
						|
in this way a completely controlled environment could
 | 
						|
be provided.
 |