我希望我的程序打印程序完成后 addr2line 可以使用的回溯。在 ubuntu 14.04 上,这是通过以下代码实现的:
void bt() {
constexpr int MAX_STACK = 30;
void *array[MAX_STACK];
auto size = backtrace(array, MAX_STACK);
std::ostringstream msg;
for (int i = 0; i < size; ++i) {
msg << array[i] << " ";
}
std::cout << msg.str() << std::endl;
}
// sample output: 0x55db7a9fdea3 0x55db7a9fdfd5 0x55db7a9fdfe1 0x55db7a9fe01f
现在在 ubuntu 18.04 上使用时,addr2line 提供了很多??:0
. 我对backtrace_symbols(3)
linux 函数给出的人类可读格式不感兴趣,我想要简洁的格式,可以在必要时使用单独分发的调试符号(剥离到单独的 .dbg 文件)进行解码。
我可以编译-no-pie
,但我不想。这似乎是我们在生产中不想要的东西。
我了解到,如果对于每个指针(array[i]
上面),我从中删除值/proc/<pid>/maps
并转换回十六进制,我得到的地址对于 addr2line 是可以理解的。所以问题是:
如何在不查看 /proc 中的文本文件的情况下获取代码中的偏移量?或者有没有更好的方法来实现简洁的回溯?