@node Debugging Support
@c @node Debugging Support, POSIX Threads, Cryptographic Functions, Top
@c %MENU% Functions to help debugging applications
@chapter Debugging support

Applications are usually debugged using dedicated debugger programs.
But sometimes this is not possible and, in any case, it is useful to
provide the developer with as much information as possible at the time
the problems are experienced.  For this reason a few functions are
provided which a program can use to help the developer more easily
locate the problem.


@menu
* Backtraces::                Obtaining and printing a back trace of the
                               current stack.
@end menu


@node Backtraces, , , Debugging Support
@section Backtraces

@cindex backtrace
@cindex backtrace_symbols
@cindex backtrace_fd
A @dfn{backtrace} is a list of the function calls that are currently
active in a thread.  The usual way to inspect a backtrace of a program
is to use an external debugger such as gdb.  However, sometimes it is
useful to obtain a backtrace programmatically from within a program,
e.g., for the purposes of logging or diagnostics.

The header file @file{execinfo.h} declares three functions that obtain
and manipulate backtraces of the current thread.
@pindex execinfo.h

@comment execinfo.h
@comment GNU
@deftypefun int backtrace (void **@var{buffer}, int @var{size})
@safety{@prelim{}@mtsafe{}@asunsafe{@asuinit{} @ascuheap{} @ascudlopen{} @ascuplugin{} @asulock{}}@acunsafe{@acuinit{} @acsmem{} @aculock{} @acsfd{}}}
@c The generic implementation just does pointer chasing within the local
@c stack, without any guarantees that this will handle signal frames
@c correctly, so it's AS-Unsafe to begin with.  However, most (all?)
@c arches defer to libgcc_s's _Unwind_* implementation, dlopening
@c libgcc_s.so to that end except in a static version of libc.
@c libgcc_s's implementation may in turn defer to libunwind.  We can't
@c assume those implementations are AS- or AC-safe, but even if we
@c could, our own initialization path isn't, and libgcc's implementation
@c calls malloc and performs internal locking, so...
The @code{backtrace} function obtains a backtrace for the current
thread, as a list of pointers, and places the information into
@var{buffer}.  The argument @var{size} should be the number of
@w{@code{void *}} elements that will fit into @var{buffer}.  The return
value is the actual number of entries of @var{buffer} that are obtained,
and is at most @var{size}.

The pointers placed in @var{buffer} are actually return addresses
obtained by inspecting the stack, one return address per stack frame.

Note that certain compiler optimizations may interfere with obtaining a
valid backtrace.  Function inlining causes the inlined function to not
have a stack frame; tail call optimization replaces one stack frame with
another; frame pointer elimination will stop @code{backtrace} from
interpreting the stack contents correctly.
@end deftypefun

@comment execinfo.h
@comment GNU
@deftypefun {char **} backtrace_symbols (void *const *@var{buffer}, int @var{size})
@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @aculock{}}}
@c Collects info returned by _dl_addr in an auto array, allocates memory
@c for the whole return buffer with malloc then sprintfs into it storing
@c pointers to the strings into the array entries in the buffer.
@c _dl_addr takes the recursive dl_load_lock then calls
@c _dl_find_dso_for_object and determine_info.
@c _dl_find_dso_for_object calls _dl-addr_inside_object.
@c All of them are safe as long as the lock is held.
@c @asucorrupt?  It doesn't look like the dynamic loader's data
@c structures could be in an inconsistent state that would cause
@c malfunction here.
The @code{backtrace_symbols} function translates the information
obtained from the @code{backtrace} function into an array of strings.
The argument @var{buffer} should be a pointer to an array of addresses
obtained via the @code{backtrace} function, and @var{size} is the number
of entries in that array (the return value of @code{backtrace}).

The return value is a pointer to an array of strings, which has
@var{size} entries just like the array @var{buffer}.  Each string
contains a printable representation of the corresponding element of
@var{buffer}.  It includes the function name (if this can be
determined), an offset into the function, and the actual return address
(in hexadecimal).

Currently, the function name and offset only be obtained on systems that
use the ELF binary format for programs and libraries.  On other systems,
only the hexadecimal return address will be present.  Also, you may need
to pass additional flags to the linker to make the function names
available to the program.  (For example, on systems using GNU ld, you
must pass (@code{-rdynamic}.)

The return value of @code{backtrace_symbols} is a pointer obtained via
the @code{malloc} function, and it is the responsibility of the caller
to @code{free} that pointer.  Note that only the return value need be
freed, not the individual strings.

The return value is @code{NULL} if sufficient memory for the strings
cannot be obtained.
@end deftypefun

@comment execinfo.h
@comment GNU
@deftypefun void backtrace_symbols_fd (void *const *@var{buffer}, int @var{size}, int @var{fd})
@safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@aculock{}}}
@c Single loop of _dl_addr over addresses, collecting info into an iovec
@c written out with a writev call per iteration.  Addresses and offsets
@c are converted to hex in auto buffers, so the only potential issue
@c here is leaking the dl lock in case of cancellation.
The @code{backtrace_symbols_fd} function performs the same translation
as the function @code{backtrace_symbols} function.  Instead of returning
the strings to the caller, it writes the strings to the file descriptor
@var{fd}, one per line.  It does not use the @code{malloc} function, and
can therefore be used in situations where that function might fail.
@end deftypefun

The following program illustrates the use of these functions.  Note that
the array to contain the return addresses returned by @code{backtrace}
is allocated on the stack.  Therefore code like this can be used in
situations where the memory handling via @code{malloc} does not work
anymore (in which case the @code{backtrace_symbols} has to be replaced
by a @code{backtrace_symbols_fd} call as well).  The number of return
addresses is normally not very large.  Even complicated programs rather
seldom have a nesting level of more than, say, 50 and with 200 possible
entries probably all programs should be covered.

@smallexample
@include execinfo.c.texi
@end smallexample
