From b3e57fc8685af44dcf35a7f429b7410e63a9a571 Mon Sep 17 00:00:00 2001 From: Luca Barbieri Date: Wed, 18 Aug 2010 00:39:49 +0200 Subject: u_debug_symbol: add support for getting symbol names from glibc --- src/gallium/auxiliary/util/u_debug_symbol.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'src/gallium/auxiliary/util/u_debug_symbol.c') diff --git a/src/gallium/auxiliary/util/u_debug_symbol.c b/src/gallium/auxiliary/util/u_debug_symbol.c index 7147bbc32b..ebea517f90 100644 --- a/src/gallium/auxiliary/util/u_debug_symbol.c +++ b/src/gallium/auxiliary/util/u_debug_symbol.c @@ -143,6 +143,23 @@ debug_symbol_name_imagehlp(const void *addr, char* buf, unsigned size) } #endif +#ifdef __GLIBC__ +#include + +/* This can only provide dynamic symbols, or binary offsets into a file. + * + * To fix this, post-process the output with tools/addr2line.sh + */ +static INLINE void +debug_symbol_name_glibc(const void *addr, char* buf, unsigned size) +{ + char** syms = backtrace_symbols((void**)&addr, 1); + strncpy(buf, syms[0], size); + buf[size - 1] = 0; + free(syms); +} +#endif + void debug_symbol_name(const void *addr, char* buf, unsigned size) { @@ -152,6 +169,12 @@ debug_symbol_name(const void *addr, char* buf, unsigned size) return; #endif +#ifdef __GLIBC__ + debug_symbol_name_glibc(addr, buf, size); + if(buf[0]) + return; +#endif + util_snprintf(buf, size, "%p", addr); buf[size - 1] = 0; } -- cgit v1.2.3