Существует два способа использования 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
делает в любом случае, поэтому нет необходимости переводить эту опцию на что-либо.