/simpletypesystem/trunk

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/simpletypesystem/trunk

« back to all changes in this revision

Viewing changes to src/utils.h

  • Committer: Gustav Hartvigsson
  • Date: 2015-07-07 12:30:58 UTC
  • Revision ID: gustav.hartvigsson@gmail.com-20150707123058-91ck0chaw4yckbpn
* Moved print_backtrace() to utils.h

Show diffs side-by-side

added added

removed removed

Lines of Context:
110
110
 */
111
111
#define round_up(num, multiple) (((num + multiple - 1) / multiple) * multiple)
112
112
 
 
113
/* -------- TraceBack stuff ---- */
 
114
 
 
115
#define S_STACK_TRACKE_SIZE 128
 
116
 
 
117
#ifdef  __unix__
 
118
  //#pragma message ("We are a UNIX.")
 
119
  #include <execinfo.h>
 
120
  /**
 
121
   * Get a platform specific traceback.
 
122
   *
 
123
   * Works on UNIX's and Windows (Not working).
 
124
   */
 
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");\
 
132
    } else {\
 
133
      for (int i = 0; i < _backtrace_len_; i++) {\
 
134
        fprintf (stderr, "%s\n", _backtrace_strs_[i]);\
 
135
      }\
 
136
      free (_backtrace_strs_);\
 
137
    }\
 
138
    fprintf (stderr, "[END BACKTRACE]\n");\
 
139
  }
 
140
#elif __WIN32__ || __WIN64__
 
141
  //#pragma message ("We are a Windows (why, oh why?)")
 
142
  #include <windows.h>
 
143
  #include <dbghelp.h>
 
144
  #include <winbase.h>
 
145
  #if __WIN64__
 
146
    #define _PLATFORM_SPECIFIC_DWORD DWORD64
 
147
  #else
 
148
    #define _PLATFORM_SPECIFIC_DWORD DWORD
 
149
  #endif
 
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);\
 
162
    }\
 
163
    SymCleanup (_backtrace_proc);\
 
164
    free (_backtrace_symbol);\
 
165
    fprintf (stderr, "[END BACKTRACE]\n");\
 
166
  }
 
167
#else
 
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");\
 
172
  }
 
173
#endif
 
174
 
113
175
BEGIN_DECLS
114
176
 
115
177
#endif