diff options
| -rw-r--r-- | src/gallium/auxiliary/util/u_debug_symbol.c | 23 | ||||
| -rwxr-xr-x | src/gallium/tools/addr2line.sh | 26 | 
2 files changed, 49 insertions, 0 deletions
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 <execinfo.h> + +/* 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;  } diff --git a/src/gallium/tools/addr2line.sh b/src/gallium/tools/addr2line.sh new file mode 100755 index 0000000000..34dec14271 --- /dev/null +++ b/src/gallium/tools/addr2line.sh @@ -0,0 +1,26 @@ +#!/bin/bash +# This script processes symbols output by Gallium using glibc to human-readable function names + +lastbin= +i=-1 +dir="$(mktemp -d)" +input="$1" + +# Gather all unique addresses for each binary +sed -nre 's|([^ ]*/[^ ]*)\(\+0x([^)]*).*|\1 \2|p' "$input"|sort|uniq|while read bin addr; do +	if test "$lastbin" != "$bin"; then +		((++i)) +		lastbin="$bin" +		echo "$bin" > "$dir/$i.addrs.bin" +	fi +	echo "$addr" >> "$dir/$i.addrs" +done + +# Construct a sed script to convert hex address to human readable form, and apply it +for i in "$dir"/*.addrs; do +	bin="$(<"$i.bin")" +	addr2line -p -e "$bin" -a -f < "$i"|sed -nre 's@^0x0*([^:]*): ([^?]*)$@s|'"$bin"'(+0x\1)|\2|g@gp' +	rm -f "$i" "$i.bin" +done|sed -f - "$input" + +rmdir "$dir"  | 
