+void CommonError::LogBacktrace() {
+ // Only do this work if we're actually going to log things
+ if(secinfoenabled("security_exception")) {
+ const size_t maxsize = 32;
+ void* callstack[maxsize];
+
+ int size = backtrace(callstack, maxsize);
+ char** names = backtrace_symbols(callstack, size);
+
+ // C++ symbolicate the callstack
+
+ const char* delim = " ";
+ string build;
+ char * token = NULL;
+ char * line = NULL;
+
+ for(int i = 0; i < size; i++) {
+ build = "";
+
+ line = names[i];
+
+ while((token = strsep(&line, delim))) {
+ if(*token == '\0') {
+ build += " ";
+ } else {
+ int status = 0;
+ char * demangled = abi::__cxa_demangle(token, NULL, NULL, &status);
+ if(status == 0) {
+ build += demangled;
+ } else {
+ build += token;
+ }
+ build += " ";
+
+ if(demangled) {
+ free(demangled);
+ }
+ }
+ }
+
+ secinfo("security_exception", "%s", build.c_str());
+ }
+ free(names);
+ }
+}
+
+