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

Другие вопросы по тегам