получить адрес для addr2line в двоичном файле -pie внутри программы - PullRequest
1 голос
/ 06 марта 2019

Я хочу, чтобы моя программа печатала следы, которые будут использоваться 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? Или есть лучший метод для достижения краткого обратного следа?

...