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