是否有一个相当于DebugBreak()/ __ debugbreak的便携式?

在MSVC中, DebugBreak()或__debugbreak导致debugging器中断。 在x86上它相当于写了“_asm int 3”,在x64上它有些不同。 当用gcc(或其他标准编译器)编译时,我也想闯入debugging器。 有独立于平台的function还是内在的? 我看到了关于这个问题的XCode问题 ,但它似乎不够便捷。

旁注:我主要想要实现ASSERT,我知道我可以使用assert(),但我也想写DEBUG_BREAK或东西到代码中。

那么如何定义一个基于#ifdef的条件macros,扩展到基于当前体系结构或平台的不同构造。

就像是:

#ifdef _MSC_VER #define DEBUG_BREAK __debugbreak() #else ... #endif 

预处理器将根据编译代码的平台来扩展正确的debugging器中断指令。 这样你总是在代码中使用DEBUG_BREAK

一个可移植到大多数POSIX系统的方法是:

 raise(SIGTRAP); 

GCC有一个名为__builtin_trap的内build函数,你可以在这里看到,但是假设代码执行一旦到达就停止。

应该确保__builtin_trap()调用是有条件的,否则在它后面不会有代码被发射。

这个post被所有5分钟的testing,YMMV推动。

如果你认为assert(x)足够便携,assert(false)似乎是你的问题的明显的便携式解决scheme。

这看起来像一个合适的compat库https://github.com/scottt/debugbreak

如果您试图debugging崩溃相关的条件,那么老式的abort()会在大多数平台上给您一个调用堆栈。 缺点是无法继续使用目前的个人电脑,而您可能不想这么做。

http://www.cplusplus.com/reference/cstdlib/abort/

 #define __debugbreak() \ do \ { static bool b; \ while (!b) \ sleep(1); \ b = false; \ } while (false) 

当进程正在hibernate时,您可以将一个debugging器附加到进程中,更改variablesb以打破循环并执行您的操作。 此代码可能无法在优化版本中工作!

为了不使用“正常”的debugging中断,为什么不使用以下其中一项,如被零除:

 int iCrash = 13 / 0; 

或者解引用一个NULL指针:

 BYTE bCrash = *(BYTE *)(NULL); 

至less在许多平台/体系结构中这是可移植的。

在许多debugging器中,您可以指定要对哪些exception执行什么操作,以便在发生上述操作时(例如暂停执行,ala“int 3”指令)以及生成exception时,可以执行相应的操作。