static void printBacktrace(Backtrace stacktrace) { void *const *stack = (void *const *)stacktrace.constData(); int stack_size = stacktrace.size() / sizeof(void*); char **stack_symbols = backtrace_symbols(stack, stack_size); int filter[2]; pid_t child = -1; if (pipe(filter) != -1) child = fork(); if (child == 0) { // child process dup2(fileno(stderr), fileno(stdout)); dup2(filter[0], fileno(stdin)); close(filter[0]); close(filter[1]); execlp("c++filt", "c++filt", "-n", NULL); // execlp failed execl("/bin/cat", "/bin/cat", NULL); _exit(127); } // parent process close(filter[0]); FILE *output; if (child == -1) { // failed forking close(filter[1]); output = stderr; } else { output = fdopen(filter[1], "w"); } fprintf(stderr, "Backtrace of the first creation (most recent frame first):\n"); for (int i = 0; i < stack_size; ++i) { if (strlen(stack_symbols[i])) fprintf(output, "#%-2d %s\n", i, stack_symbols[i]); else fprintf(output, "#%-2d %p\n", i, stack[i]); } if (child != -1) { fclose(output); waitpid(child, 0, 0); } }
void visit(Backtrace & backtrace) { for (size_t i = 0; i < backtrace.size(); i ++) { visit(backtrace[i]); os << "\n"; } }