From 04607b8aa91051bb43cd652dca1cef1579ed5dad Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Fri, 18 May 2012 16:53:22 -0700 Subject: [PATCH] Test libcorkscrew's ELF symbol table decoder too. Change-Id: I3180ffe07b44245c698dd03a789a3b337f32872a --- libcorkscrew/test.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/libcorkscrew/test.c b/libcorkscrew/test.c index 2d1ba7cc9..1d6c3cb9c 100644 --- a/libcorkscrew/test.c +++ b/libcorkscrew/test.c @@ -1,4 +1,5 @@ #include +#include #include #include @@ -15,7 +16,28 @@ void do_backtrace() { char line[MAX_BACKTRACE_LINE_LENGTH]; format_backtrace_line(i, &frames[i], &backtrace_symbols[i], line, MAX_BACKTRACE_LINE_LENGTH); - fprintf(stderr, " %s\n", line); + if (backtrace_symbols[i].symbol_name != NULL) { + // get_backtrace_symbols found the symbol's name with dladdr(3). + fprintf(stderr, " %s\n", line); + } else { + // We don't have a symbol. Maybe this is a static symbol, and + // we can look it up? + symbol_table_t* symbols = NULL; + if (backtrace_symbols[i].map_name != NULL) { + symbols = load_symbol_table(backtrace_symbols[i].map_name); + } + const symbol_t* symbol = NULL; + if (symbols != NULL) { + symbol = find_symbol(symbols, frames[i].absolute_pc); + } + if (symbol != NULL) { + uintptr_t offset = frames[i].absolute_pc - symbol->start; + fprintf(stderr, " %s (%s%+d)\n", line, symbol->name, offset); + } else { + fprintf(stderr, " %s (\?\?\?)\n", line); + } + free(symbols); + } } free_backtrace_symbols(backtrace_symbols, frame_count);