一尘不染

在Linux上断言失败后继续调试吗?

linux

当Windows上的Visual C ++断言失败时,调试器将停止,显示消息,然后让您继续(或者,如果未运行调试会话,则为您启动Visual
Studio)。

在Linux上,assert()的默认行为似乎是显示错误并退出程序。由于我所有的断言都通过宏进行,因此我尝试使用信号来解决此问题,例如

#define ASSERT(TEST) if(!(TEST)) raise(SIGSTOP);

但是,尽管GDB(通过KDevelop)停在了正确的位置,但我似乎无法继续过去,并且在GDB中手动发送信号只会让我感到困惑,无法控制GDB或调试过程。


阅读 422

收藏
2020-06-07

共1个答案

一尘不染

您确实想重新创建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);
2020-06-07