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

drp*_*per 16 c c++ linux gdb assert

当在Windows上使用Visual C++断言失败时,调试器会停止,显示消息,然后让您继续(或者,如果没有运行调试会话,则提供为您启动Visual Studio).

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

#define ASSERT(TEST) if(!(TEST)) raise(SIGSTOP);
Run Code Online (Sandbox Code Playgroud)

但是虽然GDB(通过KDevelop)停在正确的位置,但我似乎无法继续通过信号,并且在GDB内手动发送信号只会让我感到不知所措,无论是GDB还是调试过程都无法控制.

Dou*_* T. 18

你真的想重新创建DebugBreak的行为.这会在调试器中停止程序.

我在谷歌搜索"DebugBreak linux"已经发现了几个 对这个内联汇编的引用,它应该做同样的事情.

#define DEBUG_BREAK asm("int $3")
Run Code Online (Sandbox Code Playgroud)

然后你的断言可以成为

#define ASSERT(TEST) if(!(TEST)) asm("int $3");
Run Code Online (Sandbox Code Playgroud)

根据Andomar int 3导致cpu引发中断3.根据drpepper,更便携的方法是调用:

 raise(SIGTRAP);
Run Code Online (Sandbox Code Playgroud)


Jef*_*ter 10

您可以配置gdb以不同的方式处理特定信号.例如,以下内容将导致SIGSTOP不被视为可停止事件.

handle SIGSTOP nostop noprint pass

help handle 在gdb内将为您提供更多信息.