我看到以下使用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
的函数名。谢谢。
答案 0 :(得分: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
就是这样做的,因此无需将该选项转换为任何内容。