3

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

4

0 回答 0