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

标签 c++ c linux gdb assert

当在 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/

相关文章:

c++ - 如何编写适用于任何类型集合对象的 size() 函数?

c - 如何自动增加 C 结构体的内存分配?

c - 从管道读取错误

c - 将图像从资源移动到 C 中的文件夹

java - 为什么 'Files.exists'返回true,而 'File.exists'返回false?仅当文件名为多字节字符时才会发生

linux - Shell 脚本 (BASH) 中的多处理

c++ - 如何从 QImage (Qt 4.6) 中裁剪多边形(填充多边形图像)

c++ - QMenu 中的非交互式项目

c++ - 多平台多处理?

linux - 在 *nix shell 中更容易导航