在程序内部的-pie二进制文件中获取addr2line的地址

时间:2019-03-06 14:31:39

标签: c++ linux backtrace aslr position-independent-code

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

0 个答案:

没有答案