Я вижу следующий пример с использованием 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
. Спасибо.
Возможный дубликат инструмент, похожий на readelf, для Mac OS X?
Почему он дублируется? В ссылке, на которую вы ссылались, ничего не говорилось об atos.
Это «возможный дубликат»; там есть ответ, в котором упоминается установка binutils MacPorts, возможно, взгляните на это, и если это не решит вашу проблему, сообщите, и я отменю закрытое голосование.
Известно, что addr2line плохо работает в Mac OS X.
Есть два способа использования 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
. Что-то не так?
Я предполагаю, что ваша программа была загружена по (несколько) случайному адресу из-за ASLR. Если это произойдет, вы должны передать либо адрес загрузки, либо слайд в atos
, иначе он не сможет сопоставить адреса с символами. Вы можете предотвратить это, связав программу с опцией компоновщика -no_pie
. (Если компилятор управляет компоновщиком, как это часто бывает, вы должны передать его как -Wl,-no_pie
.)
В ПОРЯДКЕ. Это работает большую часть времени. Но иногда пишет atos[79546]: [fatal] child process status could not be determined; exit code unavailable.
Знаете что не так?
Я не знаком с этой ошибкой. Вы используете -o <image file path>
или -p <pid>
? Упоминание о дочернем процессе заставляет меня думать о последнем, но, возможно, он запускает какой-то внутренний вспомогательный процесс, и это то, о чем он говорит.
Я использовал команду, которую вы упомянули, с -o. Поскольку процесс завершен, указать pid невозможно.
Возможно, вы одновременно запускаете огромное количество экземпляров atos
?
Символ «
??
» указывает на то, что addr2line не имеет отладочной информации по этому адресу…