是否有一个相当于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()会在大多数平台上给您一个调用堆栈。 缺点是无法继续使用目前的个人电脑,而您可能不想这么做。
#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时,可以执行相应的操作。