我希望我的程序在程序完成后打印回溯到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中的文本文件的情况下获得代码中的偏移量?还是有一种更好的方法来实现简洁的回溯?