使用llvm-symbolizer查找符号¶
https://llvm.org/docs/CommandGuide/llvm-symbolizer.html
llvm-symbolizer可以用来根据PC值查找到对应的函数和该函数所在文件
意义¶
记录这个的意义在于,它从侧面印证了一个很久以来的感悟:
善于使用既有工具解决遇到的问题是一种能力。虽然之前没有像使用gcc一样去频繁使用llvm, 但面对“需要根据当前PC值知道目前所执行的函数信息”这个问题的时候,首先想到的应该就是 从工具链中寻找对应的解决方案。
当然,使用工具的能力也需要一定的知识储备,比如正是因为之前研究过elf文件格式,研究过内核加载ko模块的详细流程, 频繁的使用工具链对目标文件做一系列转换,才能深入的理解工具链中的一些工具,才能举一反三的想到去工具链中找到 解决方案。
举一反三¶
很显然,gcc里面肯定也有类似工具,通过名字观察addr2line很像, 查看说明,显然是类似的工具
riscv32-unknown-elf-addr2line -h
Usage: riscv32-unknown-elf-addr2line [option(s)] [addr(s)]
Convert addresses into line number/file name pairs.
If no addresses are specified on the command line, they will be read from stdin
The options are:
@<file> Read options from <file>
-a --addresses Show addresses
-b --target=<bfdname> Set the binary file format
-e --exe=<executable> Set the input file name (default is a.out)
-i --inlines Unwind inlined functions
-j --section=<name> Read section-relative offsets instead of addresses
-p --pretty-print Make the output easier to read for humans
-s --basenames Strip directory names
-f --functions Show function names
-C --demangle[=style] Demangle function names
-R --recurse-limit Enable a limit on recursion whilst demangling. [Default]
-r --no-recurse-limit Disable a limit on recursion whilst demangling
-h --help Display this information
-v --version Display the program's version
尝试分析一下
chsgcxy@chsgcxy-TM1703:~/workspace$ riscv32-unknown-elf-addr2line -e verification/bert.out -f 0x9532
_ZN7stc_dnn7bert_op25embeddings_postproc_slaveILi8ELi8EEEvv
/data/workspace/gem5/gem5/verification/stc-dnn/test/bert/../../include/ops/bert/bert_forward.h:6726
显然需要demangling c++的符号,再次尝试
chsgcxy@chsgcxy-TM1703:~/workspace$ riscv32-unknown-elf-addr2line -e verification/bert.out -f 0x9532 | c++filt
void stc_dnn::bert_op::embeddings_postproc_slave<8, 8>()
/data/workspace/gem5/gem5/verification/stc-dnn/test/bert/../../include/ops/bert/bert_forward.h:6726
成功了,对比一下llvm工具的输出结果
chsgcxy@chsgcxy-TM1703:~/workspace$ llvm-symbolizer --obj=verification/bert.out 0x9532
void stc_dnn::bert_op::embeddings_postproc_slave<8, 8>()
/data/workspace/gem5/gem5/verification/stc-dnn/test/bert/../../include/ops/bert/bert_forward.h:6726:49