111
111
#define round_up(num, multiple) (((num + multiple - 1) / multiple) * multiple)
113
/* -------- TraceBack stuff ---- */
115
#define S_STACK_TRACKE_SIZE 128
118
//#pragma message ("We are a UNIX.")
119
#include <execinfo.h>
121
* Get a platform specific traceback.
123
* Works on UNIX's and Windows (Not working).
125
#define print_backtrace() {\
126
fprintf (stderr, "[BACKTRACE:]\n");\
127
void ** _backtrace_data_ = calloc (S_STACK_TRACKE_SIZE, sizeof (void *));\
128
int _backtrace_len_ = backtrace (_backtrace_data_, 10);\
129
char ** _backtrace_strs_ = backtrace_symbols (_backtrace_data_, _backtrace_len_);\
130
if (_backtrace_strs_ == NULL) {\
131
fprintf (stderr, "Could not get backtrace...\n");\
133
for (int i = 0; i < _backtrace_len_; i++) {\
134
fprintf (stderr, "%s\n", _backtrace_strs_[i]);\
136
free (_backtrace_strs_);\
138
fprintf (stderr, "[END BACKTRACE]\n");\
140
#elif __WIN32__ || __WIN64__
141
//#pragma message ("We are a Windows (why, oh why?)")
146
#define _PLATFORM_SPECIFIC_DWORD DWORD64
148
#define _PLATFORM_SPECIFIC_DWORD DWORD
150
#define print_backtrace() {\
151
fprintf (stderr, "[BACKTRACE:]\n");\
152
void * _backtrace_stack[S_STACK_TRACKE_SIZE];\
153
HANDLE _backtrace_proc = GetCurrentProcess ();\
154
SymInitialize (_backtrace_proc, 0, TRUE);\
155
unsigned short _backtrace_frames = CaptureStackBackTrace ( 0, S_STACK_TRACKE_SIZE, _backtrace_stack, NULL );\
156
SYMBOL_INFO * _backtrace_symbol = calloc (1, sizeof (SYMBOL_INFOW) + (sizeof (char) * 256));\
157
_backtrace_symbol->MaxNameLen = 255;\
158
_backtrace_symbol->SizeOfStruct = sizeof (SYMBOL_INFO);\
159
for (int i = 0; i <= _backtrace_frames; i++) {\
160
SymFromAddr (_backtrace_proc, (_PLATFORM_SPECIFIC_DWORD)(_backtrace_stack[i]), 0, _backtrace_symbol);\
161
fprintf (stderr, "%i: %s - 0x%0X\n", _backtrace_frames - i, _backtrace_symbol->Name, _backtrace_symbol->Address);\
163
SymCleanup (_backtrace_proc);\
164
free (_backtrace_symbol);\
165
fprintf (stderr, "[END BACKTRACE]\n");\
168
//#pragma message ("We are not a UNIX or a Windows")
169
#define print_backtrace() {\
170
fprintf(stdout, "[Can not get backtrace]\nCurrent Function:" __func__);\
171
fprintf (stderr, "[END BACKTRACE]\n");\