我看到以下使用addr2line的示例。但是atos和addr2line的接口是不同的。我不知道如何使用atos使其工作。有人能教我如何把它转换成使用atos吗?
https://balau82.wordpress.com/2010/10/06/trace-and-profile-function-calls-with-gcc/
或者,是否有一种方法可以使addr2line在Mac上工作(众所周知,addr2line在Mac上不能很好地工作)?我只是得到??而不是使用addr2line的函数名。谢谢。
发布于 2019-01-23 06:00:02
在您链接的文章中的脚本中有两种使用addr2line的方式:
addr2line -f -e ${EXECUTABLE} ${FADDR}以及:
addr2line -s -e ${EXECUTABLE} ${CADDR}第一个选项使用-f选项,该选项使addr2line在第二行显示文件名和行号之前将函数名单独输出到一行。在该脚本中,只使用第一行(它是通过head -1管道传输的)。
atos总是输出函数名,因此不需要与该-f选项等效。addr2line是"address to line“(文件名和行号)的缩写,使函数名附属于其主要用途,而atos是”地址到符号“的缩写,因此产生符号名是其核心目的。
addr2line的下一个选项是-e ${EXECUTABLE}。atos的等价物是-o ${EXECUTABLE}。
在那之后,论点就是地址。这在addr2line和atos之间是一样的。
因此,对应于addr2line -f -e ${EXECUTABLE} ${FADDR}的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所做的,所以没有必要将该选项转换为任何东西。
https://stackoverflow.com/questions/54320054
复制相似问题