Skip to main content
Version: Next

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()栈帧数量

使用注意

  1. 需要编译器/平台支持(MSVC/Clang 较好,GCC 需确保链接 -lstdc++exp 或等待后续版本)。
  2. 优化级别为 -O2 以上时,部分函数可能被内联,栈帧信息会减少。
  3. 输出格式依赖实现,不同编译器输出不完全相同。
  4. 主要用于调试和诊断,不要依赖栈信息做程序逻辑。

小结

std::stacktrace 让你不再需要依赖平台 API(如 Linux backtrace_symbols、Windows CaptureStackBackTrace)来获取调用栈。写入错误日志时加一行 stacktrace::current(),后续排查问题事半功倍。