Как использовать Атос? (или addr2line в Mac OS X) - PullRequest
0 голосов
/ 23 января 2019

Я вижу следующий пример, используя addr2line. Но интерфейсы atos и addr2line различны. Я не уверен, как заставить это работать, используя atos. Может кто-нибудь показать мне, как преобразовать его в atos?

https://balau82.wordpress.com/2010/10/06/trace-and-profile-function-calls-with-gcc/

В качестве альтернативы, есть ли способ заставить addr2line работать на Mac (известно, что addr2line не очень хорошо работает на Mac OS X)? Я просто получаю ?? вместо имен функций, используя addr2line. Спасибо.

1 Ответ

0 голосов
/ 23 января 2019

Существует два способа использования addr2line в сценарии в статье, которую вы связали:

addr2line -f -e ${EXECUTABLE} ${FADDR}

и:

addr2line -s -e ${EXECUTABLE} ${CADDR}

В первом варианте используется параметр -f, что заставляет addr2line выводить имя функции в отдельной строке, а затем отображать имя файла и номер строки во второй строке.В этом сценарии используется только первая строка (она передается через head -1).

atos всегда выводит имя функции, поэтому нет необходимости в эквиваленте этой опции -f.[Принимая во внимание, что addr2line - это сокращение от «address to line» (имя файла и номер строки), что делает имя функции вспомогательным по отношению к своему основному назначению, atos - сокращение от «address to symbol», поэтому создание имени символа является его ядромцель.]

Следующая опция, используемая для addr2line, - -e ${EXECUTABLE}.Эквивалент atos равен -o ${EXECUTABLE}.

. После этого аргументы являются адресами.То же самое между addr2line и atos.

Итак, команда atos, которая соответствует addr2line -f -e ${EXECUTABLE} ${FADDR} , равна atos -o ${EXECUTABLE} ${FADDR}. Однако , скрипт «разбирает» выходные данные команды, и две программы выдают выходные данные в разных форматах.Чтобы получить только имя функции из вывода atos, вы можете передать его через perl -lne 'print "$1" if m/^(.*) \(in .*\)/'.

Второй тип команды addr2line не использует параметр -f, поэтому он не 't напечатать название функции.Он просто используется для получения имени файла и номера строки.Как упоминалось ранее, atos всегда печатает имя функции.Итак, команда atos такая же, как и раньше.Чтобы получить только имя файла и номер строки из его вывода, вы можете передать его через perl -lne 'print "$1" if m/^.* \(in .*\) \((.*)\)$/'.

Эта команда addr2line также использует параметр -s.Это заставляет его печатать только базовое имя пути к файлу, а не весь путь.Это то, что atos делает в любом случае, поэтому нет необходимости переводить эту опцию на что-либо.

...