macos - 如何使用atos? (或 Mac OS X 上的 addr2line)

标签 macos binutils addr2line

我看到以下使用addr2line的示例。但atosaddr2line的接口(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/

相关文章:

python - 适用于 Mac 的 TensorFlow : error importing tensorflow

android - 如何在 Android 中使用 addr2line

c++ - 使用 C++ STL 理解 addr2line 消息

android - 我如何为 Android 使用 addr2line?

c - OSX 上终端应用程序的 OpenGL

python - 如何从 Python : aka Command-Control-Shift-4 内部截取 Mac OS X 中的屏幕截图

macos - 用于在所有文件中搜索文本字符串的 Unix 命令

c - 使用 gold vs ld 链接器时使用的 glibc/pthreads 的不同符号

c++ - 给定一个使用 gcc 从 C++ 构建的 ELF 二进制文件,我如何确定其中某些类型的大小?

linux - 何时在 nm 中使用 --dynamic 选项