我看到以下使用addr2line
的示例。但atos
和addr2line
的接口(interface)是不同的。我不知道如何使用atos
使其工作。有人可以告诉我如何将其转换为使用atos
吗?
https://balau82.wordpress.com/2010/10/06/trace-and-profile-function-calls-with-gcc/
或者,有没有办法让addr2line在Mac上工作(众所周知addr2line在Mac OS X上不能很好地工作)?我只是使用 addr2line
得到 ??
而不是函数名称。谢谢。
最佳答案
有两种方式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
无论如何,所以没有必要将该选项转换为任何内容。
关于macos - 如何使用atos? (或 Mac OS X 上的 addr2line),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54320054/