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