balst.txt @PURPOSE: Provide a portable facility for obtaining & printing a stack trace. @MNEMONIC: Basic Application Library Stack Trace utilities (balst) @DESCRIPTION: The 'balst' package provides a facility for obtaining and printing a stack trace at run time. /Hierarchical Synopsis /--------------------- The 'balst' package currently has 14 components having 7 levels of physical dependency. The list below shows the hierarchical ordering of the components. The order of components within each level is not architecturally significant, just alphabetical. .. 7. balst_stacktraceprinter 6. balst_stacktraceprintutil balst_stacktracetestallocator 5. balst_stacktraceutil 4. balst_stacktraceresolverimpl_elf !PRIVATE! 3. balst_stacktraceresolver_dwarfreader !PRIVATE! balst_stacktraceresolverimpl_dladdr !PRIVATE! balst_stacktraceresolverimpl_windows !PRIVATE! balst_stacktraceresolverimpl_xcoff !PRIVATE! 2. balst_stacktrace balst_stacktraceresolver_filehelper !PRIVATE! 1. balst_objectfileformat balst_stacktraceconfigurationutil balst_stacktraceframe .. /Component Synopsis /------------------ : 'balst_objectfileformat': : Provide platform-dependent object file format trait definitions. : : 'balst_stacktrace': : Provide a description of a function-call stack. : : 'balst_stacktraceconfigurationutil': : Provide utility for global configuration of stack trace. : : 'balst_stacktraceframe': : Provide an attribute class describing an execution stack frame. : : 'balst_stacktraceprinter': : Provide an object for streaming the current stack trace. : : 'balst_stacktraceprintutil': : Provide a single function to perform and print a stack trace. : : 'balst_stacktraceresolver_dwarfreader': !PRIVATE! : Provide mechanism for reading DWARF information from object files. : : 'balst_stacktraceresolver_filehelper': !PRIVATE! : Provide platform-independent file input for stack trace resolvers. : : 'balst_stacktraceresolverimpl_dladdr': !PRIVATE! : Provide functions for resolving a stack trace using 'dladdr'. : : 'balst_stacktraceresolverimpl_elf': !PRIVATE! : Provide a utility to resolve ELF symbols in a stack trace. : : 'balst_stacktraceresolverimpl_windows': !PRIVATE! : Provide resolution of symbols in stack trace for Windows objects. : : 'balst_stacktraceresolverimpl_xcoff': !PRIVATE! : Provide a mechanism to resolve xcoff symbols in a stack trace. : : 'balst_stacktracetestallocator': : Provide a test allocator that reports the call stack for leaks. : : 'balst_stacktraceutil': : Provide low-level utilities for obtaining & printing a stack-trace. /Performance Considerations /-------------------------- Getting a strack trace through any of the components in this package involves resolving symbols and possibly line numbers and source file names, all of which are computationally very expensive, involving a lot of disk access to debug regions of the executable. If the stack trace is called once when a program crashes, this is not a problem, but if stack traces are to be called frequently during execution to monitor program behavior in some way, it is absolutely prohibitive. The lowest level of stack trace is not in this package, it is 'bsls_stackaddressutil', and it contains the code to walk down the stack and collect a buffer of 'void *'s which are return addresses from the stack, which can be obtained very quickly and without doing any disk access, to be expensively resolved to human-readable format later using 'balst_stacktraceutil' or the Bloomberg stand-alone program 'showfunc.tsk'. As an example of this, the component 'balst_stacktracetestallocator' needs to do a stack trace on every memory allocation. To do a fully-resolved stack trace each time would be a performance catastrophe. So instead, it does a fast call to 'bsls_stackaddressutil' on every memory allocation, and saves a buffer of 'void *'s each time, and then, when it is determined at the end that any of those allocations were leaked, calls 'balst_stacktraceutil' to resolve the buffer of 'void *'s corresponding to the leaked allocation into human-readable output to make a report for the client to read. /Usage /----- This section illustrates intended use of this package. /Example 1: Streaming to BALL / - - - - - - - - - - - - - - First, we define a recursive function 'recurseAndPrintStack' that recurses 4 times, then calls '<< StackTracePrinter()' to obtain a stack trace and print it to 'BALL_LOG_FATAL': .. #include <balst_stacktraceprinter.h> void recurseAndStreamStackDefault() // Recurse 4 times and print a stack trace to 'BALL_LOG_FATAL'. { static int recurseCount = 0; if (recurseCount++ < 4) { recurseAndStreamStackDefault(); } else { BALL_LOG_FATAL << balst::StackTracePrinter(); } } .. which, on Linux, produces the output: .. (0): recurseAndStreamStackDefault()+0x5a at 0x407762 source:balst_stacktraceprinter.t.cpp:723 in balst_stacktraceprinter.t (1): recurseAndStreamStackDefault()+0x27 at 0x40772f source:balst_stacktraceprinter.t.cpp:725 in balst_stacktraceprinter.t (2): recurseAndStreamStackDefault()+0x27 at 0x40772f source:balst_stacktraceprinter.t.cpp:725 in balst_stacktraceprinter.t (3): recurseAndStreamStackDefault()+0x27 at 0x40772f source:balst_stacktraceprinter.t.cpp:725 in balst_stacktraceprinter.t (4): recurseAndStreamStackDefault()+0x27 at 0x40772f source:balst_stacktraceprinter.t.cpp:725 in balst_stacktraceprinter.t (5): main+0x1a7 at 0x407a37 source:balst_stacktraceprinter.t.cpp:857 in balst_stacktraceprinter.t (6): __libc_start_main+0xf5 at 0x7fab4df69495 in /lib64/libc.so.6 (7): --unknown-- at 0x406205 in balst_stacktraceprinter.t .. Note that long lines of output here have been hand-wrapped to fit into comments in this 79-column source file. Also note that if the full path of the executable or library is too long, only the basename will be displayed, while if it is short, then the full path will be displayed.