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