| @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 |