一、诊断库
最近在看欧洲战场的分析,很多军事相关的资料都提到了体系战。其实不光军事如此,其它的领域也是如此。在计算机的世界,特别是编程语言的环境中更是如此。语言要想发展,从标准到实现,从调试工具到编译链接的工具链等一系列的相关技术都得同步跟进和发展。所以谓军事上的体系,在这里其实可以叫做生态。
C++语言也无法脱离这个情况,从最初的标准到现在最新的标准,从没有IDE到有IDE,从使用命令调试到使用界面调试,从人工处理相关的代码检查到命令再到AI,凡此等等,其实都是各种技术互相促进发展的结果,是一个C++生态自己从动态变化到稳定再到动态变化并如此不断重复的过程。
C++发展到今天不是一两次暴发式的发展形成的,是不断的完善不断的创新的结果。在C++26中,推出了更加完善的诊断库的支持,主要包括标准库组件以及工具链的增强。引入诊断库后,可以更好的提高开发到调试以及错误控制的效率。
本文重点分析一下标准库引入的debugging库。
二、debugging库的主要内容
在C++26的标准库中主要引入了以下几个调试函数:
-
breakpoint
无条件断点(应用过GDB调试的就很容易理解),当调用时暂停正在运行的程序,它是自定义实现的。它会尝试临时停止程序并且无论是否检测到调试器都将会控制权转给调试器。其主要是对运行时通过断点进行控制,即使出现超调试器的范围也不能会导致程序的退出。
此函数的标准化了很多已经现有的工具,如__builtin_debugtrap(LLVM),__debugbreak(Win32 API),debugger_break(boost.test), assert(false), _asm { int 3 } (MSVC) 和 asm(“int3”) (GCC/clang)等等(x86平台)。 -
breakpoint_if_debugging
类似于条件断点,会try临时暂停程序的运行并可以将相关控制权转移到调试器(假设存在的情况下,否则视为空操作),可由开发者自定义实现。如果 std::is_debugger_present 返回 true,则调用 std::breakpoint。等价于:
if (std::is_debugger_present())
std::breakpoint();
- is_debugger_present
检查程序是否在调试器的控制下运行,注意此函数是可替换的即可自定义实现。此函数允许自行定义和打印额外的诊断信息及执行相关的测试代码等,等于是给了开发者一个注入点。
这三个函数的定义为:
namespace std {
// debugging utility
void breakpoint() noexcept;
void breakpoint_if_debugging() noexcept;
bool is_debugger_present() noexcept;
}
三、例程
看一个简单的例程:
//Linux环境
#include <debugging>
#include <string>
#include <iostream>
bool is_debugger_present() {
std::ifstream status("/proc/self/status");
std::string statusLine;
while (std::getline(status, statusLine)) {
if (statusLine.starts_with("TracerPid:")) {
return statusLine.find("0") == std::string::npos;
}
}
return false;
}
void printlnDumpState(){
//输出相关信息
}
int main(){
if (std::is_debugger_present()) {
std::cerr << "start debugging...\n";
printlnDumpState();
std::breakpoint();
}
return 0;
}
代码很简单,大家明白这个意思就可以了。
四、总结
现在人们都说世界是个草台班子,意思就是说大家不要把很多东西想得多么高大上,正如俗语“锦袍下全是虱子”,道理相通。其实确实如此,所有的事物都是如此发展变化的,只要努力前进,就会如庄子说的:其作始也简,其将毕也必巨!

4万+





