Go to the documentation of this file.
5 #ifndef BALL_COMMON_DEBUG_H
6 #define BALL_COMMON_DEBUG_H
8 #ifndef BALL_CONFIG_CONFIG_H
9 # include <BALL/CONFIG/config.h>
12 #ifdef BALL_NO_INLINE_FUNCTIONS
15 # define BALL_INLINE inline
23 # define BALL_PRECONDITION_EXCEPTION(condition, message)\
26 Exception::Precondition e(__FILE__, __LINE__, #condition);\
27 if (strcmp(message, "") != 0)\
29 ::std::string tmp(e.getMessage());\
30 tmp += ::std::string(message);\
36 # define BALL_POSTCONDITION_EXCEPTION(condition, message)\
39 Exception::Postcondition e(__FILE__, __LINE__, #condition);\
40 if (strcmp(message, "") != 0)\
42 std::string tmp(e.getMessage());\
43 tmp += std::string(message);\
49 # if defined(BALL_COMPILER_GXX) || defined(BALL_COMPILER_LLVM)
50 # include <execinfo.h>
53 # define BALL_PRINT_BACKTRACE()\
55 void *bt_addresses[100];\
58 int bt_size = backtrace(bt_addresses, 100);\
59 bt = backtrace_symbols(bt_addresses, bt_size);\
62 size_t num_demangled;\
64 std::vector<String> split;\
66 for(int i = 0; i < bt_size; i++)\
68 String mangled(bt[i]);\
70 Log.warn() << i << ": " << bt[i] << " ";\
71 mangled = mangled.getField(1, "()");\
72 mangled = mangled.getField(0, "+");\
74 char* out = abi::__cxa_demangle(mangled.c_str(), demangled, &num_demangled, &status);\
75 if (status == 0) Log.warn() << "demangled: " << String(out);\
76 if (num_demangled > 0) free(demangled);\
78 Log.warn() << std::endl;\
84 # define BALL_PRINT_BACKTRACE()
89 # define BALL_PRECONDITION_EXCEPTION(condition, message)
90 # define BALL_POSTCONDITION_EXCEPTION(condition, message)
91 # define BALL_PRINT_BACKTRACE()
95 #endif // BALL_COMMON_DEBUG_H