22 #include "utils/PVLog.hpp" 30 #define pvAssertMessage(c, fmt, ...) 40 PV::pv_assert_failed(__FILE__, __LINE__, #c); \ 45 #define pvAssertMessage(c, fmt, ...) \ 47 PV::pv_assert_failed_message(__FILE__, __LINE__, #c, fmt, ##__VA_ARGS__); \ 52 void pv_assert_failed(
const char *file,
int line,
const char *condition);
53 void pv_assert_failed_message(
56 const char *condition,
61 static inline void print_stacktrace(FILE *out = stderr,
unsigned int max_frames = 63) {
62 StackTrace() <<
"stack trace:" << std::endl;
65 void *addrlist[max_frames + 1];
68 int addrlen = backtrace(addrlist,
sizeof(addrlist) /
sizeof(
void *));
71 StackTrace() <<
" <empty, possibly corrupt>" << std::endl;
77 char **symbollist = backtrace_symbols(addrlist, addrlen);
80 size_t funcnamesize = 256;
81 char *funcname = (
char *)malloc(funcnamesize);
85 for (
int i = 1; i < addrlen; i++) {
86 char *begin_name = 0, *begin_offset = 0, *end_offset = 0;
90 for (
char *p = symbollist[i]; *p; ++p) {
95 else if (*p ==
')' && begin_offset) {
101 if (begin_name && begin_offset && end_offset && begin_name < begin_offset) {
102 *begin_name++ =
'\0';
103 *begin_offset++ =
'\0';
111 char *ret = abi::__cxa_demangle(begin_name, funcname, &funcnamesize, &status);
114 StackTrace() <<
" " << symbollist[i] <<
" : " << funcname <<
"+" << begin_offset
120 StackTrace() <<
" " << symbollist[i] <<
" : " << begin_name <<
"+" << begin_offset
126 StackTrace() <<
" " << symbollist[i] << std::endl;