trace: Filter out uninteresting functions from backtrace

This filters out the functions inside trace.c and functions before
main() since those are not relevant to the actual issue that is being
reported.
This commit is contained in:
Jouni Malinen 2009-12-22 01:29:15 +02:00
parent a6ff0e0810
commit 94caf8cd62

View file

@ -198,6 +198,25 @@ static void wpa_trace_bfd_addr(void *pc)
} }
static const char * wpa_trace_bfd_addr2func(void *pc)
{
bfd *abfd = cached_abfd;
struct bfd_data data;
if (abfd == NULL)
return NULL;
data.pc = (bfd_vma) pc;
data.found = FALSE;
bfd_map_over_sections(abfd, find_addr_sect, &data);
if (!data.found)
return NULL;
return data.function;
}
static void wpa_trace_bfd_init(void) static void wpa_trace_bfd_init(void)
{ {
if (!prg_fname) { if (!prg_fname) {
@ -226,6 +245,7 @@ static void wpa_trace_bfd_init(void)
#define wpa_trace_bfd_init() do { } while (0) #define wpa_trace_bfd_init() do { } while (0)
#define wpa_trace_bfd_addr(pc) do { } while (0) #define wpa_trace_bfd_addr(pc) do { } while (0)
#define wpa_trace_bfd_addr2func(pc) NULL
#endif /* WPA_TRACE_BFD */ #endif /* WPA_TRACE_BFD */
@ -233,16 +253,32 @@ void wpa_trace_dump_func(const char *title, void **btrace, int btrace_num)
{ {
char **sym; char **sym;
int i; int i;
enum { TRACE_HEAD, TRACE_RELEVANT, TRACE_TAIL } state;
wpa_trace_bfd_init(); wpa_trace_bfd_init();
wpa_printf(MSG_INFO, "WPA_TRACE: %s - START", title); wpa_printf(MSG_INFO, "WPA_TRACE: %s - START", title);
sym = backtrace_symbols(btrace, btrace_num); sym = backtrace_symbols(btrace, btrace_num);
state = TRACE_HEAD;
for (i = 0; i < btrace_num; i++) { for (i = 0; i < btrace_num; i++) {
const char *func = wpa_trace_bfd_addr2func(btrace[i]);
if (state == TRACE_HEAD && func &&
(os_strcmp(func, "wpa_trace_add_ref_func") == 0 ||
os_strcmp(func, "wpa_trace_check_ref") == 0 ||
os_strcmp(func, "wpa_trace_show") == 0))
continue;
if (state == TRACE_TAIL && sym && sym[i] &&
os_strstr(sym[i], "__libc_start_main"))
break;
if (state == TRACE_HEAD)
state = TRACE_RELEVANT;
if (sym) if (sym)
wpa_printf(MSG_INFO, "[%d]: %s", i, sym[i]); wpa_printf(MSG_INFO, "[%d]: %s", i, sym[i]);
else else
wpa_printf(MSG_INFO, "[%d]: ?? [%p]", i, btrace[i]); wpa_printf(MSG_INFO, "[%d]: ?? [%p]", i, btrace[i]);
wpa_trace_bfd_addr(btrace[i]); wpa_trace_bfd_addr(btrace[i]);
if (state == TRACE_RELEVANT && func &&
os_strcmp(func, "main") == 0)
state = TRACE_TAIL;
} }
free(sym); free(sym);
wpa_printf(MSG_INFO, "WPA_TRACE: %s - END", title); wpa_printf(MSG_INFO, "WPA_TRACE: %s - END", title);