Как использовать атос? (или 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. Спасибо.

Символ «??» указывает на то, что addr2line не имеет отладочной информации по этому адресу…

l'L'l 23.01.2019 05:33

Возможный дубликат инструмент, похожий на readelf, для Mac OS X?

l'L'l 23.01.2019 05:35

Почему он дублируется? В ссылке, на которую вы ссылались, ничего не говорилось об atos.

user1424739 23.01.2019 05:43

Это «возможный дубликат»; там есть ответ, в котором упоминается установка binutils MacPorts, возможно, взгляните на это, и если это не решит вашу проблему, сообщите, и я отменю закрытое голосование.

l'L'l 23.01.2019 06:56

Известно, что addr2line плохо работает в Mac OS X.

user1424739 23.01.2019 15:26
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
3 808
1

Ответы 1

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

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

и:

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

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

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

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

Я пробовал. Но он просто печатает исходный адрес $ atos -o main.exe 0x7fff569f0015\n 0x7fff569f0015. Что-то не так?

user1424739 23.01.2019 15:20

Я предполагаю, что ваша программа была загружена по (несколько) случайному адресу из-за ASLR. Если это произойдет, вы должны передать либо адрес загрузки, либо слайд в atos, иначе он не сможет сопоставить адреса с символами. Вы можете предотвратить это, связав программу с опцией компоновщика -no_pie. (Если компилятор управляет компоновщиком, как это часто бывает, вы должны передать его как -Wl,-no_pie.)

Ken Thomases 23.01.2019 17:11

В ПОРЯДКЕ. Это работает большую часть времени. Но иногда пишет atos[79546]: [fatal] child process status could not be determined; exit code unavailable. Знаете что не так?

user1424739 23.01.2019 17:21

Я не знаком с этой ошибкой. Вы используете -o <image file path> или -p <pid>? Упоминание о дочернем процессе заставляет меня думать о последнем, но, возможно, он запускает какой-то внутренний вспомогательный процесс, и это то, о чем он говорит.

Ken Thomases 23.01.2019 20:03

Я использовал команду, которую вы упомянули, с -o. Поскольку процесс завершен, указать pid невозможно.

user1424739 23.01.2019 21:05

Возможно, вы одновременно запускаете огромное количество экземпляров atos?

Ken Thomases 23.01.2019 22:15

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