From e1c4a4bd9b4507c86643ac825deb61da047f53e1 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 5 Feb 2016 15:09:16 +0100 Subject: [PATCH] Use inline assembly with gcc under Linux for CATCH_TRAP This is more convenient than using the generic portable raise(SIGTRAP) as it avoids having another stack frame in the debugger when the break happens. --- include/internal/catch_debugger.h | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/include/internal/catch_debugger.h b/include/internal/catch_debugger.h index 4c83efd..060cbc9 100644 --- a/include/internal/catch_debugger.h +++ b/include/internal/catch_debugger.h @@ -34,9 +34,16 @@ namespace Catch{ #endif #elif defined(CATCH_PLATFORM_LINUX) - #include + // If we can use inline assembler, do it because this allows us to break + // directly at the location of the failing check instead of breaking inside + // raise() called from it, i.e. one stack frame below. + #if defined(__GNUC__) && (defined(__i386) || defined(__x86_64)) + #define CATCH_TRAP() asm volatile ("int $3") + #else // Fall back to the generic way. + #include - #define CATCH_TRAP() raise(SIGTRAP) + #define CATCH_TRAP() raise(SIGTRAP) + #endif #elif defined(_MSC_VER) #define CATCH_TRAP() __debugbreak() #elif defined(__MINGW32__)