如何使用atos? (或在Mac OS X上为addr2line)

时间:2019-01-23 04:31:20

标签: macos binutils addr2line

我看到以下使用addr2line的示例。但是atosaddr2line的接口是不同的。我不确定如何使用atos使它工作。有人可以告诉我如何将其转换为使用atos吗?

https://balau82.wordpress.com/2010/10/06/trace-and-profile-function-calls-with-gcc/

或者,是否有一种方法可以使addr2line在Mac上运行(众所周知,addr2line在Mac OS X上不能正常运行)?我只是得到??而不是使用addr2line的函数名。谢谢。

1 个答案:

答案 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}

在那之后,参数是地址。 addr2lineatos之间是相同的。

因此,与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就是这样做的,因此无需将该选项转换为任何内容。