是否有一种可移植/符合标准的方法来获取堆栈跟踪中的文件名和行号?

ein*_*ica 7 c c++ glibc stack-trace libunwind

我刚读完

当我的 gcc C++ 应用程序崩溃时如何生成堆栈跟踪

现在已经很老了(5年)。一些答案提出了解决方案,允许您为每个堆栈帧获取函数的名称和偏移量(我猜是在堆栈内)。但是我(可能还有其他人)真正需要的是进行调用的源文件名和行号(假设代码是用调试信息编译的)。链接到执行此操作的 glibc 的一部分的答案之一(libSegfault;请参阅此目录中的文件- segfault.c, backtracesyms.c, backtracesymsfd.c) - 所以它是可能的

我的问题是:

  • 可以以独立于平台的方式提取此信息,还是可以符合某种标准(POSIX??)
  • 为什么 libunwind 不支持这个?(我认为没有,在浏览了他们的网站后
  • 这是否一定取决于您的编译器的 C/C++ 标准库(至少对于 C/C++ 应用程序)?

笔记:

  • 你可以假设二进制文件有调试信息,所以在 C/C++ 的情况下,它是用-g; 当然,在适当的库中,我们会检查调试信息是否可用。

ein*_*ica 3

添加到 @EmployedRussian 的有效答案 - 现在有一个多平台库可以执行此操作:

提升堆栈跟踪

只是为了说明跟踪的样子,如果您要编写:

// This following definition may be necessary to ensure you can get
// line numbers included in the stack trace; see:
// /sf/ask/272990931/
// for details
//
#define BOOST_STACKTRACE_USE_ADDR2LINE

#include <boost/stacktrace.hpp>

// ... somewhere inside the `bar(int)` function that is called recursively:
std::cout << boost::stacktrace::stacktrace();
Run Code Online (Sandbox Code Playgroud)

你可能会得到类似的信息(例如在 Linux 上):

0# bar(int) at /path/to/source/file.cpp:70
1# bar(int) at /path/to/source/file.cpp:70
2# bar(int) at /path/to/source/file.cpp:70
3# bar(int) at /path/to/source/file.cpp:70
4# main at /path/to/main.cpp:93
5# __libc_start_main in /lib/x86_64-linux-gnu/libc.so.6
6# _start
Run Code Online (Sandbox Code Playgroud)