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

标签 c++ c stack-trace glibc libunwind

我刚读完

How to generate a stacktrace when my gcc C++ app crashes

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

我的问题是:

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

注意事项:

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

最佳答案

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

Boost StackTrace

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

// This following definition may be necessary to ensure you can get
// line numbers included in the stack trace; see:
// https://stackoverflow.com/questions/3899870/
// 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();

你可能会得到类似的东西(例如在 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

关于c++ - 是否有一种可移植/符合标准的方法来获取堆栈跟踪中的文件名和行号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40751832/

相关文章:

c - 隐式和显式转换

c++ - 为什么允许引用指针的间接寻址?

c++ - 在类中不定义静态数组大小是不是很糟糕?--而是让它自动调整大小

c++ - 空指针错误

arrays - 有没有办法将 2D 数组传递到 pthreads 函数中?

python - 如何在我的 Django 500.html 页面中包含堆栈跟踪?

macros - 在 Common Lisp 中获取宏的堆栈跟踪模拟

debugging - 在 Go 中快速查找文件和行号抛出错误的技巧?

c++ - 将数组指针/引用发送到模板

c++ - FSM 在 C++ 中使用成员函数指针