当Windows上的Visual C ++断言失败时,调试器将停止,显示消息,然后让您继续(或者,如果未运行调试会话,则为您启动Visual Studio)。
在Linux上,assert()的默认行为似乎是显示错误并退出程序。由于我所有的断言都通过宏进行,因此我尝试使用信号来解决此问题,例如
#define ASSERT(TEST) if(!(TEST)) raise(SIGSTOP);
但是,尽管GDB(通过KDevelop)停在了正确的位置,但我似乎无法继续过去,并且在GDB中手动发送信号只会让我感到困惑,无法控制GDB或调试过程。
您确实想重新创建DebugBreak的行为。这将停止调试器中的程序。
我对“ DebugBreak linux”的谷歌搜索已经发现了对该内联汇编的一些 引用,这些内联汇编应该也可以这样做。
#define DEBUG_BREAK asm("int $3")
然后你的断言可以变成
#define ASSERT(TEST) if(!(TEST)) asm("int $3");
根据 Andomar的 说法,int 3会导致cpu引发中断3。根据 drpepper 的说法,更 简便 的方法是调用:
raise(SIGTRAP);