1*03f9172cSAndroid Build Coastguard Worker /* 2*03f9172cSAndroid Build Coastguard Worker * Backtrace debugging 3*03f9172cSAndroid Build Coastguard Worker * Copyright (c) 2009, Jouni Malinen <[email protected]> 4*03f9172cSAndroid Build Coastguard Worker * 5*03f9172cSAndroid Build Coastguard Worker * This software may be distributed under the terms of the BSD license. 6*03f9172cSAndroid Build Coastguard Worker * See README for more details. 7*03f9172cSAndroid Build Coastguard Worker */ 8*03f9172cSAndroid Build Coastguard Worker 9*03f9172cSAndroid Build Coastguard Worker #ifndef TRACE_H 10*03f9172cSAndroid Build Coastguard Worker #define TRACE_H 11*03f9172cSAndroid Build Coastguard Worker 12*03f9172cSAndroid Build Coastguard Worker #define WPA_TRACE_LEN 16 13*03f9172cSAndroid Build Coastguard Worker 14*03f9172cSAndroid Build Coastguard Worker #ifdef WPA_TRACE 15*03f9172cSAndroid Build Coastguard Worker #include <execinfo.h> 16*03f9172cSAndroid Build Coastguard Worker 17*03f9172cSAndroid Build Coastguard Worker #include "list.h" 18*03f9172cSAndroid Build Coastguard Worker 19*03f9172cSAndroid Build Coastguard Worker #define WPA_TRACE_INFO void *btrace[WPA_TRACE_LEN]; int btrace_num; 20*03f9172cSAndroid Build Coastguard Worker 21*03f9172cSAndroid Build Coastguard Worker struct wpa_trace_ref { 22*03f9172cSAndroid Build Coastguard Worker struct dl_list list; 23*03f9172cSAndroid Build Coastguard Worker const void *addr; 24*03f9172cSAndroid Build Coastguard Worker WPA_TRACE_INFO 25*03f9172cSAndroid Build Coastguard Worker }; 26*03f9172cSAndroid Build Coastguard Worker #define WPA_TRACE_REF(name) struct wpa_trace_ref wpa_trace_ref_##name 27*03f9172cSAndroid Build Coastguard Worker 28*03f9172cSAndroid Build Coastguard Worker #define wpa_trace_dump(title, ptr) \ 29*03f9172cSAndroid Build Coastguard Worker wpa_trace_dump_func((title), (ptr)->btrace, (ptr)->btrace_num) 30*03f9172cSAndroid Build Coastguard Worker void wpa_trace_dump_func(const char *title, void **btrace, int btrace_num); 31*03f9172cSAndroid Build Coastguard Worker #define wpa_trace_record(ptr) \ 32*03f9172cSAndroid Build Coastguard Worker (ptr)->btrace_num = backtrace((ptr)->btrace, WPA_TRACE_LEN) 33*03f9172cSAndroid Build Coastguard Worker void wpa_trace_show(const char *title); 34*03f9172cSAndroid Build Coastguard Worker #define wpa_trace_add_ref(ptr, name, addr) \ 35*03f9172cSAndroid Build Coastguard Worker wpa_trace_add_ref_func(&(ptr)->wpa_trace_ref_##name, (addr)) 36*03f9172cSAndroid Build Coastguard Worker void wpa_trace_add_ref_func(struct wpa_trace_ref *ref, const void *addr); 37*03f9172cSAndroid Build Coastguard Worker #define wpa_trace_remove_ref(ptr, name, addr) \ 38*03f9172cSAndroid Build Coastguard Worker do { \ 39*03f9172cSAndroid Build Coastguard Worker if ((addr)) \ 40*03f9172cSAndroid Build Coastguard Worker dl_list_del(&(ptr)->wpa_trace_ref_##name.list); \ 41*03f9172cSAndroid Build Coastguard Worker } while (0) 42*03f9172cSAndroid Build Coastguard Worker void wpa_trace_check_ref(const void *addr); 43*03f9172cSAndroid Build Coastguard Worker size_t wpa_trace_calling_func(const char *buf[], size_t len); 44*03f9172cSAndroid Build Coastguard Worker 45*03f9172cSAndroid Build Coastguard Worker #else /* WPA_TRACE */ 46*03f9172cSAndroid Build Coastguard Worker 47*03f9172cSAndroid Build Coastguard Worker #define WPA_TRACE_INFO 48*03f9172cSAndroid Build Coastguard Worker #define WPA_TRACE_REF(n) 49*03f9172cSAndroid Build Coastguard Worker #define wpa_trace_dump(title, ptr) do { } while (0) 50*03f9172cSAndroid Build Coastguard Worker #define wpa_trace_record(ptr) do { } while (0) 51*03f9172cSAndroid Build Coastguard Worker #define wpa_trace_show(title) do { } while (0) 52*03f9172cSAndroid Build Coastguard Worker #define wpa_trace_add_ref(ptr, name, addr) do { } while (0) 53*03f9172cSAndroid Build Coastguard Worker #define wpa_trace_remove_ref(ptr, name, addr) do { } while (0) 54*03f9172cSAndroid Build Coastguard Worker #define wpa_trace_check_ref(addr) do { } while (0) 55*03f9172cSAndroid Build Coastguard Worker 56*03f9172cSAndroid Build Coastguard Worker #endif /* WPA_TRACE */ 57*03f9172cSAndroid Build Coastguard Worker 58*03f9172cSAndroid Build Coastguard Worker 59*03f9172cSAndroid Build Coastguard Worker #ifdef WPA_TRACE_BFD 60*03f9172cSAndroid Build Coastguard Worker 61*03f9172cSAndroid Build Coastguard Worker void wpa_trace_dump_funcname(const char *title, void *pc); 62*03f9172cSAndroid Build Coastguard Worker 63*03f9172cSAndroid Build Coastguard Worker #else /* WPA_TRACE_BFD */ 64*03f9172cSAndroid Build Coastguard Worker 65*03f9172cSAndroid Build Coastguard Worker #define wpa_trace_dump_funcname(title, pc) do { } while (0) 66*03f9172cSAndroid Build Coastguard Worker 67*03f9172cSAndroid Build Coastguard Worker #endif /* WPA_TRACE_BFD */ 68*03f9172cSAndroid Build Coastguard Worker 69*03f9172cSAndroid Build Coastguard Worker void wpa_trace_deinit(void); 70*03f9172cSAndroid Build Coastguard Worker 71*03f9172cSAndroid Build Coastguard Worker #endif /* TRACE_H */ 72