1// Copyright 2006-2008 the V8 project authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "src/base/logging.h" 6 7#if V8_LIBC_GLIBC || V8_OS_BSD 8# include <cxxabi.h> 9# include <execinfo.h> 10#elif V8_OS_QNX 11# include <backtrace.h> 12#endif // V8_LIBC_GLIBC || V8_OS_BSD 13#include <stdio.h> 14#include <stdlib.h> 15 16#include "src/base/platform/platform.h" 17 18namespace v8 { 19namespace base { 20 21// Attempts to dump a backtrace (if supported). 22void DumpBacktrace() { 23#if V8_LIBC_GLIBC || V8_OS_BSD 24 void* trace[100]; 25 int size = backtrace(trace, arraysize(trace)); 26 char** symbols = backtrace_symbols(trace, size); 27 OS::PrintError("\n==== C stack trace ===============================\n\n"); 28 if (size == 0) { 29 OS::PrintError("(empty)\n"); 30 } else if (symbols == NULL) { 31 OS::PrintError("(no symbols)\n"); 32 } else { 33 for (int i = 1; i < size; ++i) { 34 OS::PrintError("%2d: ", i); 35 char mangled[201]; 36 if (sscanf(symbols[i], "%*[^(]%*[(]%200[^)+]", mangled) == 1) { // NOLINT 37 int status; 38 size_t length; 39 char* demangled = abi::__cxa_demangle(mangled, NULL, &length, &status); 40 OS::PrintError("%s\n", demangled != NULL ? demangled : mangled); 41 free(demangled); 42 } else { 43 OS::PrintError("??\n"); 44 } 45 } 46 } 47 free(symbols); 48#elif V8_OS_QNX 49 char out[1024]; 50 bt_accessor_t acc; 51 bt_memmap_t memmap; 52 bt_init_accessor(&acc, BT_SELF); 53 bt_load_memmap(&acc, &memmap); 54 bt_sprn_memmap(&memmap, out, sizeof(out)); 55 OS::PrintError(out); 56 bt_addr_t trace[100]; 57 int size = bt_get_backtrace(&acc, trace, arraysize(trace)); 58 OS::PrintError("\n==== C stack trace ===============================\n\n"); 59 if (size == 0) { 60 OS::PrintError("(empty)\n"); 61 } else { 62 bt_sprnf_addrs(&memmap, trace, size, const_cast<char*>("%a\n"), 63 out, sizeof(out), NULL); 64 OS::PrintError(out); 65 } 66 bt_unload_memmap(&memmap); 67 bt_release_accessor(&acc); 68#endif // V8_LIBC_GLIBC || V8_OS_BSD 69} 70 71} } // namespace v8::base 72 73 74// Contains protection against recursive calls (faults while handling faults). 75extern "C" void V8_Fatal(const char* file, int line, const char* format, ...) { 76 fflush(stdout); 77 fflush(stderr); 78 v8::base::OS::PrintError("\n\n#\n# Fatal error in %s, line %d\n# ", file, 79 line); 80 va_list arguments; 81 va_start(arguments, format); 82 v8::base::OS::VPrintError(format, arguments); 83 va_end(arguments); 84 v8::base::OS::PrintError("\n#\n"); 85 v8::base::DumpBacktrace(); 86 fflush(stderr); 87 v8::base::OS::Abort(); 88} 89