Author: sh-sh-sh Date: Tue Jan 22 15:04:10 2008 New Revision: 43822 URL: http://svn.opensuse.org/viewcvs/yast?rev=43822&view=rev Log: Improved back trace legibility: Demangling C++ symbols Modified: trunk/core/liby2/src/genericfrontend.cc trunk/core/package/yast2-core.changes Modified: trunk/core/liby2/src/genericfrontend.cc URL: http://svn.opensuse.org/viewcvs/yast/trunk/core/liby2/src/genericfrontend.cc?rev=43822&r1=43821&r2=43822&view=diff ============================================================================== --- trunk/core/liby2/src/genericfrontend.cc (original) +++ trunk/core/liby2/src/genericfrontend.cc Tue Jan 22 15:04:10 2008 @@ -32,6 +32,8 @@ #include <stdio.h> #include <stdlib.h> #include <sstream> +#include <cxxabi.h> +#include <string> #include <ycp/y2log.h> #include <ycp/ExecutionEnvironment.h> @@ -42,6 +44,7 @@ #include <ycp/Parser.h> #include <ycp/pathsearch.h> +using std::string; ExecutionEnvironment ee; static const int YCP_ERROR = 16; @@ -52,6 +55,8 @@ static void print_help (); static void print_error (const char*, ...) __attribute__ ((format (printf, 1, 2))); static bool is_ycp_value (const char* arg); +string demangle( const char * mangled ); + // FATE 302167, info '(libc) Backtraces' void @@ -63,11 +68,54 @@ char ** strings = backtrace_symbols (frames, size); for (size_t i = 0; i < size; ++i) - y2error ("frame %zd: %s", i, strings[i]); + { + string demangled_name = demangle( strings[i] ); + y2error ("frame %2zd: %s", i, demangled_name.c_str() ); + } free (strings); } + + +string demangle( const char * mangled ) +{ + const char * func_begin = strchr( mangled, '(' ); + + if ( ! func_begin ) + return string( mangled ); + + func_begin++; // skip '(' + + string func( func_begin ); + std::size_t func_end = func.find_first_of( ")+" ); + + if ( func_end != string::npos ) + func.erase( func_end ); + + int status = 0; + char * demangled_name = + abi::__cxa_demangle( func.c_str(), + 0, // output buffer + 0, // length + & status ); + + if ( status == 0 && demangled_name ) + { + func = string( demangled_name ); + free( demangled_name ); // abi::__cxa_demangle uses malloc() + + string lib_name = string( mangled, func_begin - mangled -1 ); + + return lib_name + " " + func; + } + else + { + return string( mangled ); + } +} + + void signal_handler (int sig) { Modified: trunk/core/package/yast2-core.changes URL: http://svn.opensuse.org/viewcvs/yast/trunk/core/package/yast2-core.changes?rev=43822&r1=43821&r2=43822&view=diff ============================================================================== --- trunk/core/package/yast2-core.changes (original) +++ trunk/core/package/yast2-core.changes Tue Jan 22 15:04:10 2008 @@ -1,4 +1,9 @@ ------------------------------------------------------------------- +Tue Jan 22 15:02:51 CET 2008 - sh@suse.de + +- Improved back trace legibility: Demangling C++ symbols + +------------------------------------------------------------------- Mon Jan 16 17:06:00 CET 2008 - tgoettlicher@suse.de - updated docu for BusyIndicator widget -- To unsubscribe, e-mail: yast-commit+unsubscribe@opensuse.org For additional commands, e-mail: yast-commit+help@opensuse.org