当在 Windows 上使用 Visual C++ 的断言失败时,调试器会停止,显示消息,然后让您继续(或者,如果没有正在运行的调试 session ,则提供为您启动 Visual Studio)。
在 Linux 上,assert() 的默认行为似乎是显示错误并退出程序。由于我所有的断言都通过宏,我尝试使用信号来解决这个问题,比如
#define ASSERT(TEST) if(!(TEST)) raise(SIGSTOP);
但是虽然GDB (通过 KDevelop )停在正确的点,我似乎无法继续越过信号,并且在 GDB 中手动发送信号只会让我挂起,既不能控制 GDB,也不能控制调试的进程。
最佳答案
你真的想重现 DebugBreak 的行为.这会停止调试器中的程序。
我的“DebugBreak linux”谷歌搜索出现了several references到这个应该做同样事情的内联程序集。
#define DEBUG_BREAK asm("int $3")
那么你的断言就可以变成
#define ASSERT(TEST) if(!(TEST)) asm("int $3");
根据 Andomar int 3 导致 cpu 引发中断 3。根据 drpepper,更便携的方法是调用:
raise(SIGTRAP);
关于c++ - 在 Linux 上断言失败后继续调试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1721543/