void assertionFailure(const char* expr, const char* msg, const char* file, unsigned int line, const char* function) { writeStderr("\n\nAssertion failure: "); writeStderr(expr); writeStderr("\nMessage: "); writeStderr(msg); writeStderr("\nFile: "); writeStderr(file); writeStderr("\nLine: "); char buf[20]; uint32_t n = uint64ToBufferUnsafe(line, buf); writeFull(STDERR_FILENO, buf, n); writeStderr("\nFunction: "); writeStderr(function); writeStderr("\n"); fsyncNoInt(STDERR_FILENO); abort(); }
void SymbolizePrinter::print(uintptr_t address, const SymbolizedFrame& frame) { if (options_ & TERSE) { printTerse(address, frame); return; } SCOPE_EXIT { color(Color::DEFAULT); }; if (!(options_ & NO_FRAME_ADDRESS)) { color(kAddressColor); AddressFormatter formatter; doPrint(formatter.format(address)); } const char padBuf[] = " "; folly::StringPiece pad(padBuf, sizeof(padBuf) - 1 - (16 - 2 * sizeof(uintptr_t))); color(kFunctionColor); if (!frame.found) { doPrint(" (not found)"); return; } if (!frame.name || frame.name[0] == '\0') { doPrint(" (unknown)"); } else { char demangledBuf[2048]; demangle(frame.name, demangledBuf, sizeof(demangledBuf)); doPrint(" "); doPrint(demangledBuf[0] == '\0' ? frame.name : demangledBuf); } if (!(options_ & NO_FILE_AND_LINE)) { color(kFileColor); char fileBuf[PATH_MAX]; fileBuf[0] = '\0'; if (frame.location.hasFileAndLine) { frame.location.file.toBuffer(fileBuf, sizeof(fileBuf)); doPrint("\n"); doPrint(pad); doPrint(fileBuf); char buf[22]; uint32_t n = uint64ToBufferUnsafe(frame.location.line, buf); doPrint(":"); doPrint(StringPiece(buf, n)); } if (frame.location.hasMainFile) { char mainFileBuf[PATH_MAX]; mainFileBuf[0] = '\0'; frame.location.mainFile.toBuffer(mainFileBuf, sizeof(mainFileBuf)); if (!frame.location.hasFileAndLine || strcmp(fileBuf, mainFileBuf)) { doPrint("\n"); doPrint(pad); doPrint("-> "); doPrint(mainFileBuf); } } } }
void printDec(uint64_t val) { char buf[20]; uint32_t n = uint64ToBufferUnsafe(val, buf); gPrinter->print(StringPiece(buf, n)); }
void SymbolizePrinter::print(uintptr_t address, const SymbolizedFrame& frame) { if (options_ & TERSE) { printTerse(address, frame); return; } // Can't use sprintf, not async-signal-safe static_assert(sizeof(uintptr_t) <= 8, "huge uintptr_t?"); char buf[] = " @ 0000000000000000"; char* end = buf + sizeof(buf) - 1 - (16 - 2 * sizeof(uintptr_t)); const char padBuf[] = " "; folly::StringPiece pad(padBuf, sizeof(padBuf) - 1 - (16 - 2 * sizeof(uintptr_t))); char* p = end; *p-- = '\0'; while (address != 0) { *p-- = kHexChars[address & 0xf]; address >>= 4; } doPrint(folly::StringPiece(buf, end)); char mangledBuf[1024]; if (!frame.found) { doPrint(" (not found)"); return; } if (frame.name.empty()) { doPrint(" (unknown)"); } else if (frame.name.size() >= sizeof(mangledBuf)) { doPrint(" "); doPrint(frame.name); } else { memcpy(mangledBuf, frame.name.data(), frame.name.size()); mangledBuf[frame.name.size()] = '\0'; char demangledBuf[1024]; demangle(mangledBuf, demangledBuf, sizeof(demangledBuf)); doPrint(" "); doPrint(demangledBuf); } if (!(options_ & NO_FILE_AND_LINE)) { char fileBuf[PATH_MAX]; fileBuf[0] = '\0'; if (frame.location.hasFileAndLine) { frame.location.file.toBuffer(fileBuf, sizeof(fileBuf)); doPrint("\n"); doPrint(pad); doPrint(fileBuf); char buf[22]; uint32_t n = uint64ToBufferUnsafe(frame.location.line, buf); doPrint(":"); doPrint(StringPiece(buf, n)); } if (frame.location.hasMainFile) { char mainFileBuf[PATH_MAX]; mainFileBuf[0] = '\0'; frame.location.mainFile.toBuffer(mainFileBuf, sizeof(mainFileBuf)); if (!frame.location.hasFileAndLine || strcmp(fileBuf, mainFileBuf)) { doPrint("\n"); doPrint(pad); doPrint("-> "); doPrint(mainFileBuf); } } } }