summaryrefslogtreecommitdiff
path: root/ltrace.1
diff options
context:
space:
mode:
Diffstat (limited to 'ltrace.1')
-rw-r--r--ltrace.1267
1 files changed, 168 insertions, 99 deletions
diff --git a/ltrace.1 b/ltrace.1
index 8b459ee..aeaea76 100644
--- a/ltrace.1
+++ b/ltrace.1
@@ -1,5 +1,5 @@
.\" -*-nroff-*-
-.\" Copyright (c) 2012 Petr Machata, Red Hat Inc.
+.\" Copyright (c) 2012, 2013 Petr Machata, Red Hat Inc.
.\" Copyright (c) 1997-2005 Juan Cespedes <cespedes@debian.org>
.\"
.\" This program is free software; you can redistribute it and/or
@@ -17,13 +17,65 @@
.\" Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
.\" 02110-1301 USA
.\"
-.TH LTRACE "1" "October 2012" "" "User Commands"
+.TH LTRACE "1" "January 2013" "" "User Commands"
.SH NAME
ltrace \- A library call tracer
.SH SYNOPSIS
+.\"
+.\" ---------------------------------------------------------------------------
+.\"
+.PP
.B ltrace
-.I "[-bCfghiLrStttV] [-a column] [-A maxelts] [-D level] [-e expr] [-l library_pattern] [-n nr] [-o filename] [-p pid] ... [-s strsize] [-u username] [-w count] [-x extern] ... [--align=column] [--debug=level] [--demangle] [--help] [--indent=nr] [--library=library_pattern] [--no-signals] [--output=filename] [--version] [--where=NR] [command [arg ...]]"
+.\"
+.\" What events to trace:
+.\"
+[\-e \fIfilter\fR|\-L] [\-l|\-\-library=\fIlibrary_pattern\fR]
+[\-x \fIfilter\fR] [\-S] [\-b|\-\-no-signals]
+.\"
+.\" What to display with each event:
+.\"
+[\-i] [\-w|\-\-where=\fInr\fR] [\-r|\-t|\-tt|\-ttt] [\-T]
+.\"
+.\" Output formatting:
+.\"
+[\-F \fIpathlist\fR]
+[\-A \fImaxelts\fR] [\-s \fIstrsize\fR] [\-C|\-\-demangle]
+[\-a|\-\-align \fIcolumn\fR] [\-n|\-\-indent \fInr\fR]
+[\-o|\-\-output \fIfilename\fR]
+.\"
+.\" Various:
+.\"
+[\-D|\-\-debug \fImask\fR] [\-u \fIusername\fR]
+.\"
+.\" What processes to trace:
+.\"
+[\-f] [\-p \fIpid\fR] [[\-\-] \fIcommand [arg ...]\fR]
+.\"
+.\" ---------------------------------------------------------------------------
+.\"
+.PP
+.BR ltrace " -c"
+.\"
+.\" What events to trace:
+.\"
+[\-e \fIfilter\fR|\-L] [\-l|\-\-library=\fIlibrary_pattern\fR]
+[\-x \fIfilter\fR] [\-S]
+.\"
+.\" Output formatting:
+.\"
+[\-o|\-\-output \fIfilename\fR]
+.\"
+.\" What processes to trace:
+.\"
+[\-f] [\-p \fIpid\fR] [[\-\-] \fIcommand [arg ...]\fR]
+.\"
+.\" ---------------------------------------------------------------------------
+.\"
+.PP
+.BR ltrace " \-V|\-\-version"
+.PP
+.BR ltrace " \-h|\-\-help"
.SH DESCRIPTION
.B ltrace
@@ -37,78 +89,60 @@ It can also intercept and print the system calls executed by the program.
Its use is very similar to
.BR strace(1) .
+.B ltrace
+shows parameters of invoked functions and system calls. To determine
+what arguments each function has, it needs external declaration of
+function prototypes. Those are stored in files called \fIprototype
+libraries\fR--see ltrace.conf(5) for details on the syntax of these
+files. See the section \fBPROTOTYPE LIBRARY DISCOVERY\fR to learn how
+\fBltrace\fR finds prototype libraries.
+
.SH OPTIONS
-.TP
-.I \-a, \-\-align column
+.PP
+.IP "\-a, \-\-align \fIcolumn"
Align return values in a specific
.IR column
(default column is 5/8 of screen width).
-.TP
-.I \-A maxelts
+.IP "\-A \fImaxelts"
Maximum number of array elements to print before suppressing the rest
with an ellipsis ("..."). This also limits number of recursive
structure expansions.
-.TP
-.I \-b, \-\-no-signals
+.IP "\-b, \-\-no-signals"
Disable printing of signals recieved by the traced process.
-.TP
-.I \-c
-Count time and calls for each library call and report a summary on program exit.
-.TP
-.I \-C, \-\-demangle
+.IP \-c
+Count time and calls for each library call and report a summary on
+program exit.
+.IP "\-C, \-\-demangle"
Decode (demangle) low-level symbol names into user-level names.
Besides removing any initial underscore prefix used by the system,
this makes C++ function names readable.
-.TP
-.I \-D, \-\-debug level
-Show debugging output of
-.B ltrace
-itself.
-.I level
-must be a sum of some of the following numbers:
-.RS
-.TP
-.B 01
-DEBUG_GENERAL. Shows helpful progress information
-.TP
-.B 010
-DEBUG_EVENT. Shows every event received by a traced program
-.TP
-.B 020
-DEBUG_PROCESS. Shows every action
-.B ltrace
-carries upon a traced process
-.TP
-.B 040
-DEBUG_FUNCTION. Shows every entry to internal functions
-.RE
-.TP
-.I \-e filter
+.IP "\-D, \-\-debug \fRmask\fI"
+Show debugging output of \fBltrace\fR itself. \fImask\fR is a number
+with internal meaning that's not really well defined at all.
+\fImask\fR of 77 shows all debug messages, which is what you usually
+need.
+.IP "\-e \fIfilter"
A qualifying expression which modifies which library calls to trace.
The format of the filter expression is described in the section
\fBFILTER EXPRESSIONS\fR. If more than one \-e option appears on the
command line, the library calls that match any of them are traced. If
no \-e is given, \fB@MAIN\fR is assumed as a default.
-.TP
-.I \-f
+.IP \-f
Trace child processes as they are created by
currently traced processes as a result of the fork(2)
or clone(2) system calls.
The new process is attached immediately.
-.TP
-.I \-F
-Load an alternate config file. Normally, /etc/ltrace.conf and
-~/.ltrace.conf will be read (the latter only if it exists).
-Use this option to load the given file or files instead of
-those two default files.
-.TP
-.I \-h, \-\-help
+.IP "\-F \fIpathlist"
+Contains a colon-separated list of paths. If a path refers to a
+directory, that directory is considered when prototype libraries are
+searched (see the section \fBPROTOTYPE LIBRARY DISCOVERY\fR). If it refers to
+a file, that file is imported implicitly to all loaded prototype
+libraries.
+.IP "\-h, \-\-help"
Show a summary of the options to ltrace and exit.
-.TP
-.I \-i
+.IP \-i
Print the instruction pointer at the time of the library call.
-.TP
-.I \-l, \-\-library library_pattern
+.IP "\-l, \-\-library \fIlibrary_pattern"
Display only calls to functions implemented by libraries that match
.I library_pattern.
Multiple library patters can be specified with several instances of
@@ -120,71 +154,55 @@ the selected libraries, there's no actual guarantee that the call
won't be directed elsewhere due to e.g. LD_PRELOAD or simply
dependency ordering. If you want to make sure that symbols in given
library are actually called, use \fB-x @\fIlibrary_pattern\fR instead.
-.TP
-.I \-L
+.IP \-L
When no -e option is given, don't assume the default action of
\fB@MAIN\fR.
-.TP
-.I \-n, \-\-indent nr
-Indent trace output by
-.I nr
-number of spaces for each new nested call. Using this option makes
-the program flow visualization easy to follow.
-.TP
-.I \-o, \-\-output filename
-Write the trace output to the file
-.I filename
-rather than to stderr.
-.TP
-.I \-p pid
-Attach to the process with the process ID
-.I pid
-and begin tracing.
-.TP
-.I \-r
-Print a relative timestamp with each line of the trace.
-This records the time difference between the beginning of
-successive lines.
-.TP
-.I \-s strsize
+.IP "\-n, \-\-indent \fInr"
+Indent trace output by \fInr\fR spaces for each level of call
+nesting. Using this option makes the program flow visualization easy
+to follow. This indents uselessly also functions that never return,
+such as service functions for throwing exceptions in the C++ runtime.
+.IP "\-o, \-\-output \fIfilename"
+Write the trace output to the file \fIfilename\fR rather than to
+stderr.
+.IP "\-p \fIpid"
+Attach to the process with the process ID \fIpid\fR and begin tracing.
+This option can be used together with passing a command to execute.
+It is possible to attach to several processes by passing more than one
+option \-p.
+.IP \-r
+Print a relative timestamp with each line of the trace. This records
+the time difference between the beginning of successive lines.
+.IP "\-s \fIstrsize"
Specify the maximum string size to print (the default is 32).
-.TP
-.I \-S
+.IP \-S
Display system calls as well as library calls
-.TP
-.I \-t
+.IP \-t
Prefix each line of the trace with the time of day.
-.TP
-.I \-tt
+.IP \-tt
If given twice, the time printed will include the microseconds.
-.TP
-.I \-ttt
+.IP \-ttt
If given thrice, the time printed will include the microseconds and
the leading portion will be printed as the number of seconds since the
epoch.
-.TP
-.I \-T
+.IP \-T
Show the time spent inside each call. This records the time difference
between the beginning and the end of each call.
-.TP
-.I \-u username
+.IP "\-u \fIusername"
Run command with the userid, groupid and supplementary groups of
.IR username .
This option is only useful when running as root and enables the
correct execution of setuid and/or setgid binaries.
-.TP
-.I \-w, --where NR
-Show backtrace of NR stack frames for each traced function. This option enabled
-only if libunwind support was enabled at compile time.
-.TP
-.I \-x filter
+.IP "\-w, --where \fInr"
+Show backtrace of \fInr\fR stack frames for each traced function. This
+option enabled only if libunwind support was enabled at compile time.
+.IP "\-x \fIfilter"
A qualifying expression which modifies which symbol table entry points
to trace. The format of the filter expression is described in the
section \fBFILTER EXPRESSIONS\fR. If more than one \-x option appears
on the command line, the symbols that match any of them are traced.
No entry points are traced if no \-x is given.
-.TP
-.I \-V, \-\-version
+.IP "\-V, \-\-version"
Show the version number of ltrace and exit.
.SH FILTER EXPRESSIONS
@@ -235,7 +253,8 @@ path name.
The first rule may lack a sign, in which case \fB+\fR is assumed. If,
on the other hand, the first rule has a \fB-\fR sign, it is as if
-there was another rule \fB@*\fR in front of it.
+there was another rule \fB@\fR in front of it, which has the effect of
+tracing complement of given rule.
The above rules are used to construct the set of traced symbols. Each
candidate symbol is passed through the chain of above rules.
@@ -244,6 +263,56 @@ rule, it becomes \fImarked\fR, if it matches a \fB-\fR rule, it
becomes \fIunmarked\fR again. If, after applying all rules, the
symbol is \fImarked\fR, it will be traced.
+.SH PROTOTYPE LIBRARY DISCOVERY
+
+When a library is mapped into the address space of a traced process,
+ltrace needs to know what the prototypes are of functions that this
+library implements. For purposes of ltrace, prototype really is a bit
+more than just type signature: it's also formatting of individual
+parameters and of return value. These prototypes are stored in files
+called prototype libraries.
+
+After a library is mapped, ltrace finds out what its SONAME is. It
+then looks for a file named SONAME.conf--e.g. protolib for libc.so.6
+would be in a file called libc.so.6.conf. When such file is found
+(more about where ltrace looks for these files is below), ltrace reads
+all prototypes stored therein. When a symbol table entry point (such
+as those traced by -x) is hit, the prototype is looked up in a
+prototype library corresponding to the library where the hit occured.
+When a library call (such as those traced by -e and -l) is hit, the
+prototype is looked up in all prototype libraries loaded for given
+process. That is necessary, because a library call is traced in a PLT
+table of a caller library, but the prototype is described at callee
+library.
+
+If a library has no SONAME, basename of library file is considered
+instead. For the main program binary, basename is considered as well
+(e.g. protolib for /bin/echo would be called echo.conf). If a name
+corresponding to soname (e.g. libc.so.6.conf) is not found, and the
+module under consideration is a shared library, ltrace also tries
+partial matches. Ltrace snips one period after another, retrying the
+search, until either a protolib is found, or X.so is all that's left.
+Thus libc.so.conf would be considered, but libc.conf not.
+
+When looking for a prototype library, ltrace potentially looks into
+several directories. On Linux, those are $XDG_CONFIG_HOME/ltrace,
+$HOME/.ltrace, \fIX\fR/ltrace for each \fIX\fR in $XDG_CONFIG_DIRS and
+/usr/share/ltrace. If the environment variable XDG_CONFIG_HOME is not
+defined, ltrace looks into $HOME/.config/ltrace instead.
+
+There's also a mechanism for loading legacy config files. If
+$HOME/.ltrace.conf exists it is imported to every loaded prototype
+library. Similarly for /etc/ltrace.conf. If both exist, both are
+imported, and $HOME/.ltrace.conf is consulted before /etc/ltrace.conf.
+
+If -F contains any directories, those are searched in precedence to
+the above system directories, in the same order in which they are
+mentioned in -F. Any files passed in -F are imported similarly to
+above legacy config files, before them.
+
+See ltrace.conf(5) for details on the syntax of ltrace prototype
+library files.
+
.SH BUGS
It has most of the bugs stated in
.BR strace(1) .