u_debug_symbol: add support for getting symbol names from glibc

This commit is contained in:
Luca Barbieri
2010-08-18 00:39:49 +02:00
parent 64c4f9c566
commit b3e57fc868
2 changed files with 49 additions and 0 deletions
@@ -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;
}
+26
View File
@@ -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"