X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fbacktrace.cc;h=782ea6a91f80d87e3cbca63cb8d62e269d2e85ba;hb=3bb738d74511398cbe598b1a177a39bc93d8c84e;hp=98361ea55dda229bdf6cf74af2b8a4a11279af3e;hpb=03d1a2a58d61fc30135f49032ab95c6785aa4ec6;p=m6w6%2Flibmemcached diff --git a/libmemcached/backtrace.cc b/libmemcached/backtrace.cc index 98361ea5..782ea6a9 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,71 +35,97 @@ * */ -#include +#include "mem_config.h" -#ifdef AX_ENABLE_BACKTRACE +#include "libmemcached/backtrace.hpp" -#ifdef HAVE_EXECINFO_H -# include -#endif +#include +#include +#include -#ifdef HAVE_GCC_ABI_DEMANGLE -# include -#endif +#if defined(HAVE_SHARED_ENABLED) && HAVE_SHARED_ENABLED -#ifdef HAVE_DLFCN_H -# include +#ifdef HAVE_EXECINFO_H +#include #endif #ifdef HAVE_GCC_ABI_DEMANGLE +# include # define USE_DEMANGLE 1 #else # define USE_DEMANGLE 0 #endif +#ifdef HAVE_DLFCN_H +# include +#endif + const int MAX_DEPTH= 50; void custom_backtrace(void) { #ifdef HAVE_EXECINFO_H - void *array[MAX_DEPTH]; - - int backtrace_size= backtrace(array, MAX_DEPTH); - fprintf(stderr, "Number of stack frames obtained: %d\n", backtrace_size); + void *backtrace_buffer[MAX_DEPTH +1]; -#ifdef HAVE_DLFCN_H - Dl_info dlinfo; -#endif + 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; - for (int x= 0; x < backtrace_size; ++x) - { + if (USE_DEMANGLE) + { #ifdef HAVE_DLFCN_H - if (dladdr(array[x], &dlinfo) == 0) - { - continue; - } + 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; + } + + was_demangled= true; + fprintf(stderr, "#%d %lp in %s at %s\n", + x, backtrace_buffer[x], + called_in, + dlinfo.dli_fname); + } + } #endif + } - const char* symname= dlinfo.dli_sname; - - int status; - char* demangled= abi::__cxa_demangle(symname, NULL, 0, &status); - if (status == 0 and demangled) - { - symname= demangled; - } - - printf("object: %s, function: %s\n", dlinfo.dli_fname, symname); + if (was_demangled == false) + { + fprintf(stderr, "?%d %lp in %s\n", x, backtrace_buffer[x], symbollist[x]); + } + } - if (demangled) - { - free(demangled); + ::free(symbollist); } - } + } #endif // HAVE_EXECINFO_H +} + +#else // HAVE_SHARED_ENABLED -#else // AX_ENABLE_BACKTRACE void custom_backtrace(void) { + fprintf(stderr, "Backtrace null function called\n"); } #endif // AX_ENABLE_BACKTRACE