123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- \documentclass{article}
- \usepackage[fancyhdr,pdf]{latex2man}
- \input{common.tex}
- \begin{document}
- \begin{Name}{3}{libunwind-ptrace}{David Mosberger-Tang}{Programming Library}{ptrace() support in libunwind}libunwind-ptrace -- ptrace() support in libunwind
- \end{Name}
- \section{Synopsis}
- \File{\#include $<$libunwind-ptrace.h$>$}\\
- \noindent
- \Type{unw\_accessors\_t} \Var{\_UPT\_accessors};\\
- \Type{void~*}\Func{\_UPT\_create}(\Type{pid\_t});\\
- \noindent
- \Type{void} \Func{\_UPT\_destroy}(\Type{void~*});\\
- \noindent
- \Type{int} \Func{\_UPT\_find\_proc\_info}(\Type{unw\_addr\_space\_t}, \Type{unw\_word\_t}, \Type{unw\_proc\_info\_t~*}, \Type{int}, \Type{void~*});\\
- \noindent
- \Type{void} \Func{\_UPT\_put\_unwind\_info}(\Type{unw\_addr\_space\_t}, \Type{unw\_proc\_info\_t~*}, \Type{void~*});\\
- \noindent
- \Type{int} \Func{\_UPT\_get\_dyn\_info\_list\_addr}(\Type{unw\_addr\_space\_t}, \Type{unw\_word\_t~*}, \Type{void~*});\\
- \noindent
- \Type{int} \Func{\_UPT\_access\_mem}(\Type{unw\_addr\_space\_t}, \Type{unw\_word\_t}, \Type{unw\_word\_t~*}, \Type{int}, \Type{void~*});\\
- \noindent
- \Type{int} \Func{\_UPT\_access\_reg}(\Type{unw\_addr\_space\_t}, \Type{unw\_regnum\_t}, \Type{unw\_word\_t~*}, \Type{int}, \Type{void~*});\\
- \noindent
- \Type{int} \Func{\_UPT\_access\_fpreg}(\Type{unw\_addr\_space\_t}, \Type{unw\_regnum\_t}, \Type{unw\_fpreg\_t~*}, \Type{int}, \Type{void~*});\\
- \noindent
- \Type{int} \Func{\_UPT\_get\_proc\_name}(\Type{unw\_addr\_space\_t}, \Type{unw\_word\_t}, \Type{char~*}, \Type{size\_t}, \Type{unw\_word\_t~*}, \Type{void~*});\\
- \noindent
- \Type{int} \Func{\_UPT\_resume}(\Type{unw\_addr\_space\_t}, \Type{unw\_cursor\_t~*}, \Type{void~*});\\
- \section{Description}
- The \Func{ptrace}(2) system-call makes it possible for a process to
- gain access to the machine-state and virtual memory of \emph{another}
- process. With the right set of call-back routines, it is therefore
- possible to hook up \Prog{libunwind} to another process via
- \Func{ptrace}(2). While it's not very difficult to do so directly,
- \Prog{libunwind} further facilitates this task by providing
- ready-to-use callbacks for this purpose. The routines and variables
- implementing this facility use a name-prefix of \Func{\_UPT}, which is
- stands for ``unwind-via-ptrace''.
- An application that wants to use the \Func{\_UPT}-facility first needs
- to create a new \Prog{libunwind} address-space that represents the
- target process. This is done by calling
- \Func{unw\_create\_addr\_space}(). In many cases, the application
- will simply want to pass the address of \Var{\_UPT\_accessors} as the
- first argument to this routine. Doing so will ensure that
- \Prog{libunwind} will be able to properly unwind the target process.
- However, in special circumstances, an application may prefer to use
- only portions of the \Prog{\_UPT}-facility. For this reason, the
- individual callback routines (\Func{\_UPT\_find\_proc\_info}(),
- \Func{\_UPT\_put\_unwind\_info}(), etc.) are also available for direct
- use. Of course, the addresses of these routines could also be picked
- up from \Var{\_UPT\_accessors}, but doing so would prevent static
- initialization. Also, when using \Var{\_UPT\_accessors}, \emph{all}
- the callback routines will be linked into the application, even if
- they are never actually called.
- Next, the application can turn on ptrace-mode on the target process,
- either by forking a new process, invoking \Const{PTRACE\_TRACEME}, and
- then starting the target program (via \Func{execve}(2)), or by
- directly attaching to an already running process (via
- \Const{PTRACE\_ATTACH}). Either way, once the process-ID (pid) of the
- target process is known, a \Prog{\_UPT}-info-structure can be created
- by calling \Func{\_UPT\_create}(), passing the pid of the target process
- as the only argument. The returned void-pointer then needs to be
- passed as the ``argument'' pointer (third argument) to
- \Func{unw\_init\_remote}().
- The \Func{\_UPT\_resume}() routine can be used to resume execution of
- the target process. It simply invokes \Func{ptrace}(2) with a command
- value of \Const{PTRACE\_CONT}.
- When the application is done using \Prog{libunwind} on the target
- process, \Func{\_UPT\_destroy}() needs to be called, passing it the
- void-pointer that was returned by the corresponding call to
- \Func{\_UPT\_create}(). This ensures that all memory and other
- resources are freed up.
- \section{Availability}
- Since \Func{ptrace}(2) works within a single machine only, the
- \Prog{\_UPT}-facility by definition is not available in
- \Prog{libunwind}-versions configured for cross-unwinding.
- \section{Thread Safety}
- The \Prog{\_UPT}-facility assumes that a single \Prog{\_UPT}-info
- structure is never shared between threads. Because of this, no
- explicit locking is used. As long as only one thread uses
- a \Prog{\_UPT}-info structure at any given time, this facility
- is thread-safe.
- \section{Return Value}
- \Func{\_UPT\_create}() may return a \Const{NULL} pointer if it fails
- to create the \Prog{\_UPT}-info-structure for any reason. For the
- current implementation, the only reason this call may fail is when the
- system is out of memory.
- \section{Files}
- \begin{Description}
- \item[\File{libunwind-ptrace.h}] Headerfile to include when using the
- interface defined by this library.
- \item[\Opt{-l}\File{unwind-ptrace} \Opt{-l}\File{unwind-generic}]
- Linker-switches to add when building a program that uses the
- functions defined by this library.
- \end{Description}
- \section{See Also}
- execve(2),
- \SeeAlso{libunwind(3)},
- ptrace(2)
- \section{Author}
- \noindent
- David Mosberger-Tang\\
- Email: \Email{dmosberger@gmail.com}\\
- WWW: \URL{http://www.nongnu.org/libunwind/}.
- \LatexManEnd
- \end{document}
|