【问题标题】:How to use atos? (or addr2line on Mac OS X)如何使用atos? (或 Mac OS X 上的 addr2line)
【发布时间】:2019-06-16 14:51:23
【问题描述】:

我看到以下使用addr2line 的示例。但是atos和addr2line的接口是不同的。我不确定如何使用atos 使其工作。谁能告诉我如何将其转换为使用atos?

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

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

【问题讨论】:

  • “??”符号表示 addr2line 在该地址上没有调试信息...
  • 为什么会重复?你提到的链接没有提到atos。
  • “可能重复”;那里有一个答案提到安装 MacPorts binutils,也许看看那个,如果它不能解决你的问题,请报告回来,我会撤销关闭投票。
  • 已知 addr2line 在 Mac OS X 上不能正常工作。

标签: macos binutils addr2line


【解决方案1】:

在您链接的文章中的脚本中使用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 之间也是一样的。

所以,对应于addr2line -f -e ${EXECUTABLE} ${FADDR} 的atos 命令是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 就是这样做的,因此无需将该选项转换为任何内容。

【讨论】:

  • 我试过了。但它只打印原始地址$ atos -o main.exe 0x7fff569f0015\n 0x7fff569f0015。有什么问题吗?
  • 我的猜测是,由于 ASLR,您的程序被加载到(有点)随机地址。如果发生这种情况,您必须将加载地址或幻灯片传递给atos,否则它将无法将地址与符号匹配。您可以通过使用-no_pie 链接器选项链接程序来阻止它。 (如果编译器驱动链接器,通常是这样,您可以将其传递为-Wl,-no_pie。)
  • 好的。这在大多数情况下都有效。但是它偶尔会说atos[79546]: [fatal] child process status could not be determined; exit code unavailable.你知道怎么回事吗?
  • 我不熟悉那个错误。您使用的是-o <image file path> 还是-p <pid>?提到子进程让我想到后者,但也许它运行一些内部帮助进程,这就是它所说的。
  • 我使用了你提到的命令和-o。既然进程结束了,就没有办法指定pid了。
猜你喜欢
  • 1970-01-01
  • 2017-07-30
  • 2012-04-08
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多