X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fbacktrace.cc;h=e171fbeba360b30142083e4c4769944379e5ba79;hb=7fa883aca713b99985cf35750ab0e2ffe6ce58e0;hp=d297901615258460d6ace623259d90b9dd2009c5;hpb=fa5dde3af5a99cda67d0ab005393cfd1627bd3d5;p=awesomized%2Flibmemcached diff --git a/libmemcached/backtrace.cc b/libmemcached/backtrace.cc index d2979016..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,64 +35,97 @@ * */ -#include +#include "mem_config.h" -#ifdef HAVE_EXECINFO_H -# include -#endif +#include "libmemcached/backtrace.hpp" -#ifdef HAVE_GCC_ABI_DEMANGLE -# include -#endif +#include +#include +#include -#ifdef HAVE_DLFCN_H -# include +#if defined(HAVE_SHARED_ENABLED) && HAVE_SHARED_ENABLED + +#ifdef HAVE_EXECINFO_H +#include #endif #ifdef HAVE_GCC_ABI_DEMANGLE -# define USE_DEMANGLE 1 +# include +# define USE_DEMANGLE 1 #else -# define USE_DEMANGLE 0 +# 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]; + 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