Index: lldb/include/lldb/Utility/LLDBAssert.h =================================================================== --- lldb/include/lldb/Utility/LLDBAssert.h +++ lldb/include/lldb/Utility/LLDBAssert.h @@ -20,6 +20,6 @@ namespace lldb_private { void lldb_assert(bool expression, const char *expr_text, const char *func, const char *file, unsigned int line); -} +} // namespace lldb_private #endif // LLDB_UTILITY_LLDBASSERT_H Index: lldb/source/Utility/LLDBAssert.cpp =================================================================== --- lldb/source/Utility/LLDBAssert.cpp +++ lldb/source/Utility/LLDBAssert.cpp @@ -7,11 +7,15 @@ //===----------------------------------------------------------------------===// #include "lldb/Utility/LLDBAssert.h" - +#include "llvm/Config/config.h" #include "llvm/Support/Format.h" #include "llvm/Support/Signals.h" #include "llvm/Support/raw_ostream.h" +#if LLVM_SUPPORT_XCODE_SIGNPOSTS +#include +#endif + using namespace llvm; using namespace lldb_private; @@ -24,6 +28,14 @@ // If asserts are enabled abort here. assert(false && "lldb_assert failed"); +#if LLVM_SUPPORT_XCODE_SIGNPOSTS + if (__builtin_available(macos 10.12, iOS 10, tvOS 10, watchOS 3, *)) { + os_log_fault(OS_LOG_DEFAULT, + "Assertion failed: (%s), function %s, file %s, line %u\n", + expr_text, func, file, line); + } +#endif + // In a release configuration it will print a warning and encourage the user // to file a bug report, similar to LLVM’s crash handler, and then return // execution. Index: lldb/test/Shell/Error/assert.test =================================================================== --- /dev/null +++ lldb/test/Shell/Error/assert.test @@ -0,0 +1,4 @@ +# REQUIRES: asserts +# RUN: not --crash lldb-test assert > %t.error 2>&1 +# RUN: cat %t.error | FileCheck %s +# CHECK: Assertion failed: (false && "lldb_assert failed") Index: lldb/tools/lldb-test/lldb-test.cpp =================================================================== --- lldb/tools/lldb-test/lldb-test.cpp +++ lldb/tools/lldb-test/lldb-test.cpp @@ -29,6 +29,7 @@ #include "lldb/Target/Process.h" #include "lldb/Target/Target.h" #include "lldb/Utility/DataExtractor.h" +#include "lldb/Utility/LLDBAssert.h" #include "lldb/Utility/State.h" #include "lldb/Utility/StreamString.h" @@ -57,6 +58,7 @@ "Display LLDB object file information"); cl::SubCommand SymbolsSubcommand("symbols", "Dump symbols for an object file"); cl::SubCommand IRMemoryMapSubcommand("ir-memory-map", "Test IRMemoryMap"); +cl::SubCommand AssertSubcommand("assert", "Test assert handling"); cl::opt Log("log", cl::desc("Path to a log file"), cl::init(""), cl::sub(BreakpointSubcommand), @@ -236,6 +238,9 @@ int evaluateMemoryMapCommands(Debugger &Dbg); } // namespace irmemorymap +namespace assert { +int lldb_assert(Debugger &Dbg); +} // namespace assert } // namespace opts std::vector parseCompilerContext() { @@ -1077,6 +1082,11 @@ return 0; } +int opts::assert::lldb_assert(Debugger &Dbg) { + lldbassert(false && "lldb-test assert"); + return 1; +} + int main(int argc, const char *argv[]) { StringRef ToolName = argv[0]; sys::PrintStackTraceOnErrorSignal(ToolName); @@ -1120,6 +1130,8 @@ return opts::symbols::dumpSymbols(*Dbg); if (opts::IRMemoryMapSubcommand) return opts::irmemorymap::evaluateMemoryMapCommands(*Dbg); + if (opts::AssertSubcommand) + return opts::assert::lldb_assert(*Dbg); WithColor::error() << "No command specified.\n"; return 1;