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内将为您提供更多信息.
| 归档时间: |
|
| 查看次数: |
10423 次 |
| 最近记录: |