ein*_*ica 7 c c++ glibc stack-trace libunwind
我刚读完
现在已经很老了(5年)。一些答案提出了解决方案,允许您为每个堆栈帧获取函数的名称和偏移量(我猜是在堆栈内)。但是我(可能还有其他人)真正需要的是进行调用的源文件名和行号(假设代码是用调试信息编译的)。链接到执行此操作的 glibc 的一部分的答案之一(libSegfault;请参阅此目录中的文件- segfault.c, backtracesyms.c, backtracesymsfd.c) - 所以它是可能的。
我的问题是:
笔记:
-g; 当然,在适当的库中,我们会检查调试信息是否可用。添加到 @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)