stacktrace
std::stacktrace 是 C++23 引入的调用栈捕获库,用于在运行时获取当前函数调用链。它对调试、错误诊断、崩溃日志等场景非常有用。
头文件与基本特征
#include <stacktrace>
| 特征 | 说明 |
|---|---|
| 核心类型 | std::stacktrace_entry 单帧信息 |
| 入口信息 | 源文件名、行号、函数名等 |
| 获取当前栈 | std::stacktrace::current() |
| 输出 | 可直接 << 输出到流 |
基本用法
#include <iostream>
#include <stacktrace>
void inner() {
auto trace = std::stacktrace::current();
std::cout << trace << '\n';
}
void middle() {
inner();
}
int main() {
middle();
return 0;
}
输出类似:
0# inner() at main.cpp:6
1# middle() at main.cpp:10
2# main at main.cpp:14
遍历每个栈帧
#include <iostream>
#include <stacktrace>
void showTrace() {
auto trace = std::stacktrace::current();
for (const auto& entry : trace) {
std::cout << entry.source_file() << ':'
<< entry.source_line() << " - "
<< entry.description() << '\n';
}
}
int main() {
showTrace();
return 0;
}
常用接口
| 接口 | 作用 |
|---|---|
stacktrace::current() | 获取当前调用栈 |
entry.source_file() | 源文件路径 |
entry.source_line() | 源文件行号 |
entry.description() | 函数描述(通常包含函数名) |
entry.native_handle() | 底层句柄 |
stacktrace.size() | 栈帧数量 |
使用注意
- 需要编译器/平台支持(MSVC/Clang 较好,GCC 需确保链接
-lstdc++exp或等待后续版本)。 - 优化级别为
-O2以上时,部分函数可能被内联,栈帧信息会减少。 - 输出格式依赖实现,不同编译器输出不完全相同。
- 主要用于调试和诊断,不要依赖栈信息做程序逻辑。
小结
std::stacktrace 让你不再需要依赖平台 API(如 Linux backtrace_symbols、Windows CaptureStackBackTrace)来获取调用栈。写入错误日志时加一行 stacktrace::current(),后续排查问题事半功倍。