~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/signal_handler.cc

Merge in change for catalog to be displayed properly

Show diffs side-by-side

added added

removed removed

Lines of Context:
29
29
#include "drizzled/plugin.h"
30
30
#include "drizzled/plugin/scheduler.h"
31
31
 
32
 
#ifdef __GNUC__
33
 
#ifdef HAVE_BACKTRACE
34
 
#include <execinfo.h>
35
 
#include <cxxabi.h>
36
 
#endif // HAVE_BACKTRACE
37
 
#endif // __GNUC__
 
32
#include "drizzled/util/backtrace.h"
38
33
 
39
34
using namespace drizzled;
40
35
 
101
96
#endif
102
97
}
103
98
 
104
 
#define BACKTRACE_STACK_SIZE 50
105
99
void drizzled_handle_segfault(int sig)
106
100
{
107
101
  time_t curr_time;
151
145
                    "Hope that's ok; if not, decrease some variables in the "
152
146
                    "equation.\n\n"));
153
147
 
154
 
#ifdef __GNUC__
155
 
#ifdef HAVE_BACKTRACE
156
 
  {
157
 
    void *array[BACKTRACE_STACK_SIZE];
158
 
    size_t size;
159
 
    char **strings;
160
 
 
161
 
    size= backtrace(array, BACKTRACE_STACK_SIZE);
162
 
    strings= backtrace_symbols(array, size);
163
 
 
164
 
    std::cerr << "Number of stack frames obtained: " << size <<  std::endl;
165
 
 
166
 
    for (size_t x= 1; x < size; x++) 
167
 
    {
168
 
      size_t sz= 200;
169
 
      char *function= (char *)malloc(sz);
170
 
      char *begin= 0;
171
 
      char *end= 0;
172
 
 
173
 
      for (char *j = strings[x]; *j; ++j)
174
 
      {
175
 
        if (*j == '(') {
176
 
          begin = j;
177
 
        }
178
 
        else if (*j == '+') {
179
 
          end = j;
180
 
        }
181
 
      }
182
 
      if (begin && end)
183
 
      {
184
 
        begin++;
185
 
        *end= '\0';
186
 
 
187
 
        int status;
188
 
        char *ret = abi::__cxa_demangle(begin, function, &sz, &status);
189
 
        if (ret) 
190
 
        {
191
 
          function= ret;
192
 
        }
193
 
        else
194
 
        {
195
 
          std::strncpy(function, begin, sz);
196
 
          std::strncat(function, "()", sz);
197
 
          function[sz-1] = '\0';
198
 
        }
199
 
        std::cerr << function << std::endl;
200
 
      }
201
 
      else
202
 
      {
203
 
        std::cerr << strings[x] << std::endl;
204
 
      }
205
 
      free(function);
206
 
    }
207
 
 
208
 
 
209
 
    free (strings);
210
 
  }
211
 
#endif // HAVE_BACKTRACE
212
 
#endif // __GNUC__
 
148
  drizzled::util::custom_backtrace();
213
149
 
214
150
  write_core(sig);
215
151