25 #if defined(__GLIBC__) || defined(__APPLE__)
40 static bool output_demangled_name(
42 const std::string &stack_entry)
44 bool return_value=
false;
46 std::string working(stack_entry);
51 if(start!=std::string::npos &&
52 end!=std::string::npos &&
56 std::string mangled(working.substr(start+1, length));
58 int demangle_success=1;
59 std::unique_ptr<char, freert> demangled(
61 mangled.c_str(),
nullptr,
nullptr, &demangle_success));
63 if(demangle_success==0)
65 out << working.substr(0, start+1)
67 << working.substr(end);
82 #if defined(__GLIBC__) || defined(__APPLE__)
83 void * stack[50] = {};
85 std::size_t entries=backtrace(stack,
sizeof(stack) /
sizeof(
void *));
86 std::unique_ptr<char*, freert> description(
87 backtrace_symbols(stack, entries));
89 for(std::size_t i=0; i<entries; i++)
91 if(!output_demangled_name(out, description.get()[i]))
92 out << description.get()[i];
93 out <<
'\n' << std::flush;
97 out <<
"Backtraces not supported\n" << std::flush;
105 std::ostringstream ostr;
113 std::cerr <<
"--- begin invariant violation report ---\n";
114 std::cerr << reason.
what() <<
'\n';
115 std::cerr <<
"--- end invariant violation report ---\n";
120 std::ostringstream out;
121 out <<
"Invariant check failed\n"
122 <<
"File: " <<
file <<
":" <<
line <<
" function: " <<
function <<
'\n'
124 <<
"Reason: " <<
reason <<
'\n'
125 <<
"Backtrace:" <<
'\n'
134 if(!s.empty() && s.back() !=
'\n')