u_debug_symbol: add support for getting symbol names from glibc
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Executable
+26
@@ -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"
|
||||
Reference in New Issue
Block a user