From be1306f91aca599f390bfe6c3e1ab501caf88f65 Mon Sep 17 00:00:00 2001 From: Quantum Date: Fri, 13 Aug 2021 19:25:52 -0400 Subject: [PATCH] [common] debug: add DEBUG_ASSERT macro This, unlike the standard assert macro, is guaranteed to print the failed assertion to our log file, and tests the assertion even with NDEBUG defined so we can more easily catch failures in production binaries without crashing the program. The motivation of this is how MinGW handles assertion failures: it creates a dialog window that the headless user will not be able to see, and blocks the program from being restarted by the service. Since the failed assertion is displayed in the dialog, it doesn't print anything to the log, making it impossible to diagnose issues. --- common/include/common/debug.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/common/include/common/debug.h b/common/include/common/debug.h index 855ab643..13e7607c 100644 --- a/common/include/common/debug.h +++ b/common/include/common/debug.h @@ -97,6 +97,23 @@ void printBacktrace(void); abort(); \ } while(0) +#define DEBUG_ASSERT_PRINT(...) DEBUG_ERROR("Assertion failed: %s", #__VA_ARGS__) + +#ifdef NDEBUG + #define DEBUG_ASSERT(...) do { \ + if (!(__VA_ARGS__)) \ + DEBUG_ASSERT_PRINT(__VA_ARGS__); \ + } while (0) +#else + #define DEBUG_ASSERT(...) do { \ + if (!(__VA_ARGS__)) \ + { \ + DEBUG_ASSERT_PRINT(__VA_ARGS__); \ + abort(); \ + } \ + } while (0) +#endif + #if defined(DEBUG_SPICE) | defined(DEBUG_IVSHMEM) #define DEBUG_PROTO(fmt, args...) DEBUG_PRINT("[P]", fmt, ##args) #else