Как использовать Атос? (или addr2line в Mac OS X)
Я вижу следующий пример, используя 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 ответ
Есть два способа 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
опция, поэтому она не печатает имя функции. Он просто используется для получения имени файла и номера строки. Как упоминалось ранее, atos
всегда печатает имя функции. Итак atos
Команда такая же, как и раньше. Чтобы получить только имя файла и номер строки из его вывода, вы можете передать его через perl -lne 'print "$1" if m/^.* \(in .*\) \((.*)\)$/'
,
это addr2line
Команда также использует -s
вариант. Это заставляет его печатать только базовое имя пути к файлу, а не весь путь. Это то что atos
в любом случае, так что нет необходимости переводить эту опцию на что-либо.