std::stacktrace
是 C++23 引入的标准库组件,用于在运行时捕获、存储和操作调用栈信息。它类似于其他语言(如 Python 的 traceback
或 Java 的 StackTraceElement
)的堆栈跟踪功能,帮助开发者调试或记录程序执行路径。
1 核心功能:
- 捕获当前调用栈:通过
std::stacktrace::current()
获取当前线程的调用栈。 - 存储和访问栈帧:以容器形式(如
std::vector<std::stacktrace_entry>
)存储栈帧,支持迭代和索引访问。 - 符号信息解析:可获取函数名、源文件路径、行号等(依赖编译器和环境支持)。
- 轻量级设计:允许禁用(通过宏
__cpp_lib_stacktrace
检测支持性)。
2 示例
#include <stacktrace>
#include <iostream>
void foo()
{
auto trace = std::stacktrace::current();
for (const auto& entry : trace)
{
std::cout << "File: " << entry.source_file()
<< ", Line: " << entry.source_line()
<< ", Function: " << entry.description() << '\n';
}
}
void bar()
{
foo();
}
int main()
{
bar();
return 0;
}
输出示例(依赖环境):
File: example.cpp, Line: 5, Function: foo()
File: example.cpp, Line: 12, Function: bar()
File: example.cpp, Line: 16, Function: main
3 编译器支持情况
编译器 | 最低支持版本 | 备注 |
---|---|---|
GCC | 12.1 (部分支持) | 需链接 -lstdc++_libbacktrace ,符号解析可能不完整。 |
Clang | 15.0 (实验性支持) | 需链接 -lexecinfo (BSD)或依赖系统库,功能有限。 |
MSVC | Visual Studio 2022 17.5 | 完全支持,需 /std:c++latest 和 Windows 调试符号(PDB 文件)。 |
Apple Clang | 未支持 | 截至 Clang 15,macOS 上无官方支持。 |
4 使用注意事项
- 符号解析依赖环境:需启用调试信息(如 GCC 的
-g
)和正确链接库。 - 性能开销:捕获栈可能较慢,建议仅在错误处理时使用。
- 平台差异:Windows 需 PDB 文件,Linux 需
libbacktrace
或libunwind
。
5 替代方案(若编译器不支持)
- Boost.Stacktrace:功能相似,支持多平台(需链接
boost_stacktrace
)。
#include <boost/stacktrace.hpp>
void print_stack()
{
std::cout << boost::stacktrace::stacktrace();
}