00001 #include <dlfcn.h>
00002 #include <execinfo.h>
00003 #include <tools/log.h>
00004 #include "tools/backtrace.h"
00005
00006 void ShowBacktrace(LogLevel l)
00007 {
00008 void** stack = NULL;
00009 int stack_size = sizeof(void*);
00010 int size = 1;
00011
00012 do
00013 {
00014 stack_size *= 2;
00015
00016 free(stack);
00017 stack = (void**) malloc(stack_size);
00018
00019 size = backtrace(stack, stack_size / sizeof(void*));
00020 } while(size == stack_size);
00021
00022 char** symbols = backtrace_symbols(stack, stack_size / sizeof(void*));
00023
00024 for(int i = 0; i < size; i++)
00025 {
00026 Dl_info info;
00027 if(dladdr(stack[i], &info) != 0)
00028 log(l, "%3i : %p %s %s", i, stack[i], info.dli_fname, info.dli_sname);
00029 else
00030 log(l, "%3i : %p %s", i, stack[i], symbols[i]);
00031 }
00032
00033 free(stack);
00034 free(symbols);
00035 }
00036