Protium
Math and Design Features
 All Classes Namespaces Files Functions Variables Typedefs Enumerator Friends Macros Pages
SignalCatching.cxx
Go to the documentation of this file.
2 
3 #include <iostream>
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <execinfo.h>
7 #include <cxxabi.h>
8 #include <signal.h>
9 #include <malloc.h>
10 
11 //---------------------------------------------------------------------
13  //Protium::Utilities::SignalCatcher::Instance().Handle(signum);
14  Protium:Private::print_stacktrace();
15  exit(-1);
16 }
17 //---------------------------------------------------------------------
18 
19 //---------------------------------------------------------------------
20 static inline void Protium::Private::print_stacktrace(unsigned int stack_depth)
21 {
22 
23  std::cout<<"Stack Trace:"<<std::endl;;
24 
25  void* trace_addr[stack_depth+1];//to be used as a list of the
26 
27  unsigned int trace_addr_length = backtrace(trace_addr, sizeof(trace_addr) / sizeof(void*));
28 
29  if (!trace_addr_length)
30  {
31  std::cout<<"Stack Empty"<<std::endl;
32  return;
33  }
34  char** trace_symbols = backtrace_symbols(trace_addr, trace_addr_length);
35 
36  size_t function_name_size = 256;
37  char* function_name = (char*)malloc(function_name_size);
38 
39 
40  for (int i = 1; i < trace_addr_length; i++)
41  {
42  char *begin_name = 0, *begin_offset = 0, *end_offset = 0;
43  for (char *p = trace_symbols[i]; *p; ++p)//for (char *p = trace_symbols[i]; *p!=NULL; ++p)
44  {
45  if (*p == '(')
46  begin_name = p;
47  else if (*p == '+')
48  begin_offset = p;
49  else if (*p == ')' && begin_offset)
50  {
51  end_offset = p;
52  break;
53  }
54  }
55 
56  if (begin_name && begin_offset && end_offset && begin_name < begin_offset)
57  {
58  *begin_name++ = '\0';
59  *begin_offset++ = '\0';
60  *end_offset = '\0';
61 
62  // mangled name is now in [begin_name, begin_offset) and caller
63  // offset in [begin_offset, end_offset). now apply
64  // __cxa_demangle():
65 
66  int status;
67  char* ret = abi::__cxa_demangle(begin_name,
68  function_name, &function_name_size, &status);
69  if (status == 0)
70  {
71  function_name = ret; // use possibly realloc()-ed string
72  std::cout<<trace_symbols[i]<<" : "<<function_name<<"+"<<begin_offset<<std::endl;;
73  }
74  else
75  {
76  std::cout<<trace_symbols[i]<<" : "<<function_name<<"()+"<<begin_offset<<std::endl;
77  }
78  }
79  else
80  {
81  std::cout<<trace_symbols[i]<<std::endl;
82  }
83  }
84  free(function_name);
85  free(trace_symbols);
86 }
87 //---------------------------------------------------------------------
88 namespace Protium{
89  namespace Utilities{
90  //SignalCatcher::Instance().Setup();
91  }
92 }
93 
94 //---------------------------------------------------------------------
void signal_callback_handler(int signum)