1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/base/Backtrace.cc
15 #include "zypp/base/LogTools.h"
16 #include "zypp/base/String.h"
17 #include "zypp/base/Backtrace.h"
21 ///////////////////////////////////////////////////////////////////
24 std::ostream & dumpBacktrace( std::ostream & stream_r )
26 // get void*'s for all entries on the stack
27 static const size_t arraySize = 50;
28 void *array[arraySize];
29 size_t size = ::backtrace( array, arraySize );
31 // Print out all frames to stderr. Separate sigsegvHandler stack
32 // [dumpBacktrace][sigsegvHandler][libc throwing] from actual
34 char ** messages = ::backtrace_symbols( array, size );
37 static const size_t handlerStack = 3; // [dumpBacktrace][sigsegvHandler][libc throwing]
38 static const size_t first = 0;
39 for ( size_t i = first; i < size; ++i )
41 char * mangled_name = 0;
42 char * offset_begin = 0;
43 char * offset_end = 0;
45 // find parentheses and +address offset surrounding mangled name
46 for ( char * p = messages[i]; *p; ++p )
63 int btLevel = i-handlerStack; // negative level in sigsegvHandler
68 stream_r << "vvvvvvvvvv----------------------------------------" << endl;
70 stream_r << "[" << (btLevel<0 ?"hd":"bt") << "]: (" << btLevel << ") ";
72 // if the line could be processed, attempt to demangle the symbol
73 if ( mangled_name && offset_begin && offset_end && mangled_name < offset_begin )
75 *mangled_name++ = '\0';
76 *offset_begin++ = '\0';
80 char * real_name = ::abi::__cxa_demangle( mangled_name, 0, 0, &status );
82 // if demangling is successful, output the demangled function name
85 stream_r << messages[i] << " : " << real_name << "+" << offset_begin << offset_end;
87 // otherwise, output the mangled function name
90 stream_r << messages[i] << " : " << mangled_name << "+" << offset_begin << offset_end;
96 // otherwise, print the whole line
97 stream_r << messages[i];
106 ///////////////////////////////////////////////////////////////////