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