X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fbacktrace.cc;h=e171fbeba360b30142083e4c4769944379e5ba79;hb=770d4f6b4cc99bff87d27f4cbe52b2c6a2f2fbd2;hp=81cfddefcc94d69fe014b3154f46c228b330ecdd;hpb=2e52a0a4fe2f17ea724a97409047874c341317ab;p=awesomized%2Flibmemcached diff --git a/libmemcached/backtrace.cc b/libmemcached/backtrace.cc index 81cfddef..e171fbeb 100644 --- a/libmemcached/backtrace.cc +++ b/libmemcached/backtrace.cc @@ -1,8 +1,8 @@ /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab: * - * libmcachedd client library. + * Libmemcached client library. * - * Copyright (C) 2011 Data Differential, http://datadifferential.com/ + * Copyright (C) 2012 Data Differential, http://datadifferential.com/ * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -35,68 +35,97 @@ * */ -#include +#include "mem_config.h" + +#include "libmemcached/backtrace.hpp" -#include -#include #include +#include +#include + +#if defined(HAVE_SHARED_ENABLED) && HAVE_SHARED_ENABLED #ifdef HAVE_EXECINFO_H -# include +#include #endif #ifdef HAVE_GCC_ABI_DEMANGLE -# include +# include +# define USE_DEMANGLE 1 +#else +# define USE_DEMANGLE 0 #endif #ifdef HAVE_DLFCN_H -# include -#endif - -#ifdef HAVE_GCC_ABI_DEMANGLE -# define USE_DEMANGLE 1 -#else -# define USE_DEMANGLE 0 -#endif +# include +#endif const int MAX_DEPTH= 50; void custom_backtrace(void) { #ifdef HAVE_EXECINFO_H - void *array[MAX_DEPTH]; + void *backtrace_buffer[MAX_DEPTH +1]; - int backtrace_size= backtrace(array, MAX_DEPTH); - fprintf(stderr, "Number of stack frames obtained: %d\n", backtrace_size); + int stack_frames= backtrace(backtrace_buffer, MAX_DEPTH); + if (stack_frames) + { + char **symbollist= backtrace_symbols(backtrace_buffer, stack_frames); + if (symbollist) + { + for (int x= 0; x < stack_frames; x++) + { + bool was_demangled= false; + if (USE_DEMANGLE) + { #ifdef HAVE_DLFCN_H - Dl_info dlinfo; -#endif + Dl_info dlinfo; + if (dladdr(backtrace_buffer[x], &dlinfo)) + { + char demangled_buffer[1024]; + const char *called_in= ""; + if (dlinfo.dli_sname) + { + size_t demangled_size= sizeof(demangled_buffer); + int status; + char* demangled; + if ((demangled= abi::__cxa_demangle(dlinfo.dli_sname, demangled_buffer, &demangled_size, &status))) + { + called_in= demangled; + fprintf(stderr, "---> demangled: %s -> %s\n", demangled_buffer, demangled); + } + else + { + called_in= dlinfo.dli_sname; + } - for (int x= 0; x < backtrace_size; ++x) - { -#ifdef HAVE_DLFCN_H - if (dladdr(array[x], &dlinfo) == 0) - { - continue; - } + was_demangled= true; + fprintf(stderr, "#%d %p in %s at %s\n", + x, backtrace_buffer[x], + called_in, + dlinfo.dli_fname); + } + } #endif + } - const char* symname= dlinfo.dli_sname; + if (was_demangled == false) + { + fprintf(stderr, "?%d %p in %s\n", x, backtrace_buffer[x], symbollist[x]); + } + } - int status; - char* demangled= abi::__cxa_demangle(symname, NULL, 0, &status); - if (status == 0 and demangled) - { - symname= demangled; + ::free(symbollist); } + } +#endif // HAVE_EXECINFO_H +} - printf("object: %s, function: %s\n", dlinfo.dli_fname, symname); +#else // HAVE_SHARED_ENABLED - if (demangled) - { - free(demangled); - } - } -#endif // HAVE_EXECINFO_H +void custom_backtrace(void) +{ + fprintf(stderr, "Backtrace null function called\n"); } +#endif // AX_ENABLE_BACKTRACE