首页 > 解决方案 > 如何使用atos?(或 Mac OS X 上的 addr2line)

问题描述

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

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

或者,有没有办法让 addr2line 在 Mac 上工作(众所周知 addr2line 在 Mac OS X 上不能很好地工作)?我只是??使用addr2line. 谢谢。

标签: macosbinutilsaddr2line

解决方案


addr2line您链接的文章中的脚本有两种使用方式:

addr2line -f -e ${EXECUTABLE} ${FADDR}

和:

addr2line -s -e ${EXECUTABLE} ${CADDR}

第一个使用该-f选项,这会导致addr2line在第二行显示文件名和行号之前先在一行上单独输出函数名。在该脚本中,仅使用第一行(通过管道传输head -1)。

atos始终输出函数名称,因此不需要与该-f选项等效的名称。[而addr2line“address to line”(文件名和行号)的缩写,使函数名附属于其主要目的,atos是“address to symbol”的缩写,因此产生符号名称是其核心目的。]

用于的下一个选项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无论如何,所以没有必要将该选项翻译成任何东西。


推荐阅读