自 C++26 起,提供了
std::breakpoint
和 std::breakpoint_if_debugging
。 std::breakpoint
是一个“无条件断点”,它会中断程序无论是否处于调试模式。
根据我的理解,断点应该只在程序在调试模式下运行时才起作用。否则,它永远不会恢复,因为调试器不存在。
这是否意味着下面的代码将在没有调试模式的情况下永远挂起?
int main()
{
// Not in debug mode
std::breakpoint();
std::cout << "hello, world" << std::endl;
return 0;
}
而且,从修订历史来看,早期的设计确实是一个条件断点。
我在LLVM和boost.test中发现了类似的设计。看来这个设计是主流了
那么,什么场景下会用
std::breakpoint
来代替std::breakpoint_if_debugging
呢?
也就是说,在什么情况下会无条件使用这些断点而不是检查调试模式?还是我错过了什么?
来自P2546R5:
函数的目标是在调用时“中断”或暂停正在运行的程序。具有无条件,即尝试中断,即使调试器实际上是否正在监视程序允许在无法检测调试器是否存在的情况下使用。std::breakpoint
(强调我的)
考虑到
std::breakpoint_if_debugging()
定义为:
void breakpoint_if_debugging() noexcept {
if (is_debugger_present()) breakpoint();
}
它允许您调用
std::breakpoint()
,即使 std::is_debugger_present()
是错误的,或者当您没有附加调试器时您想要断点的效果。
根据我的理解,断点应该只在程序在调试模式下运行时才起作用。否则,它永远不会恢复,因为调试器不存在。
在 Linux 系统上,
std::breakpoint()
实际上应该是 asm("int3")
,它发送 SIGTRAP。这不必由调试器处理,您可以为其编写自己的信号处理程序。
我认为在 Windows 上,如果还没有调试器,它会提示用户附加调试器,如果您使用的话,则不会这样做
std::breakpoint_if_debugging()