macos - 如何使用atos?(或 Mac OS X 上的 addr2line)
问题描述
我看到以下示例使用addr2line
. 但是 和 的接口atos
是addr2line
不同的。我不确定如何使用atos
. 有人可以告诉我如何将其转换为 usingatos
吗?
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
“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
无论如何,所以没有必要将该选项翻译成任何东西。
推荐阅读
- javascript - 如何将参数传递给带有处理程序的函数?
- c++ - 用 Qt 连接 CLion
- elasticsearch - 复杂的弹性搜索查询
- python - 这个 \n 来自我的数组(Python)中的哪里?
- dynamic - MIPS 动态阵列分配
- db2-400 - SQLRPGLE & JSON_OBJECT CTE 语句 -101 错误
- python - 集成矩阵元素类型错误:f() 接受 1 个位置参数,但给出了 3 个
- python - 使用 SQLalchemy 和 Presto 连接到 jTDS Microsoft 服务器
- android - 以编程方式更改 TextInputLayout textColorHint 颜色以指示/显示内部禁用的 editText
- ios - 使用 for 循环下载图像并保存到核心数据