【发布时间】:2021-06-29 03:24:39
【问题描述】:
我尝试利用 perf 来记录二进制文件的执行流程以及调用堆栈。为了解析符号,我安装了所有必要的调试包(如 -dbg 和 dbgsym 包)。
现在 perf 可以解析二进制的符号,但是那些 plt 符号无法解析。一个例子:
我的命令:
perf record -e intel_pt//u wget www.google.com
perf script --itrace=cri0ns -F+flags,+insn,+ip,+pid,+tid,+sym
wget 246443/246443 [006] 3733275.105775: 1 instructions:u: jcc 562233367dec xcalloc+0x1c (/usr/bin/wget) insn: 75 0f
wget 246443/246443 [006] 3733275.105775: 1 instructions:u: call 562233367dee xcalloc+0x1e (/usr/bin/wget) insn: e8 7d ff fb ff
wget 246443/246443 [006] 3733275.105775: 1 branches:u: call 562233367dee xcalloc+0x1e (/usr/bin/wget) insn: e8 7d ff fb ff
wget 246443/246443 [006] 3733275.105775: 1 instructions:u: 562233327d70 [unknown] (/usr/bin/wget) insn: f3 0f 1e fa
wget 246443/246443 [006] 3733275.105775: 1 instructions:u: jmp 562233327d74 [unknown] (/usr/bin/wget) insn: f2 ff 25 0d 50 07 00
wget 246443/246443 [006] 3733275.105775: 1 instructions:u: 7f73b9ec2c90 __libc_calloc+0x0 (/usr/lib/x86_64-linux-gnu/libc-2.31.so) insn: f3 0f 1e fa
wget 246443/246443 [006] 3733275.105775: 1 instructions:u: 7f73b9ec2c94 __libc_calloc+0x4 (/usr/lib/x86_64-linux-gnu/libc-2.31.so) insn: 41 55
wget 246443/246443 [006] 3733275.105775: 1 instructions:u: 7f73b9ec2c96 __libc_calloc+0x6 (/usr/lib/x86_64-linux-gnu/libc-2.31.so) insn: 48 89 f8
如您所见,那些[unknown] 符号代表.plt 部分。但是为什么没有解决呢?
【问题讨论】:
-
您能否添加用于记录和报告 IntelPT 跟踪的精确命令行?
-
可能的解决方法:使用
gcc -fno-plt构建以使其使用call *calloc@GOTPCREL(%rip)而不是call calloc@plt。
标签: linux symbols trace processor perf