我想分析使用调试符号编译的应用程序:
$ file ../../bin/linux-x86_64/simulator
../../bin/linux-x86_64/simulator: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=156bbd57d203d72f4226ed4ad0727bcf472f83ef, for GNU/Linux 3.2.0, with debug_info, not stripped
它在 podman 容器内运行。容器是 debian 11,主机是 ubuntu 22.04。我之前已经能够使用 perf 了,但我一定忘记了一些必要的配置。
我在容器外做的:
sudo sysctl kernel.perf_event_paranoid=-1
然后进入容器:
podman run --privileged --entrypoint=bash --network=host --rm -it -v ./st.cmd/:/opt/ad-sim-epics-ioc/iocBoot/iocsimulator/st.cmd -v /home/marco:/home/marco ghcr.io/cnpem/ad-sim-epics-ioc:v1.0.0
最后安装 perf:
apt-get 更新 && apt-get 安装 linux-perf
获取分析器结果:
perf record -g ./st.cmd # st.cmd is an interpreter with shebang poiting to ../../bin/linux-x86_64/simulator
第一次尝试时,系统会抱怨:
/usr/bin/perf:第 13 行:执行:perf_5.15:未找到
但是自从我发现几个人声称可以复制或符号链接性能:
ln -s /usr/bin/perf_5.10 /usr/bin/perf_5.15
最后:
perf record -g ./st.cmd
(do things...)
^C
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.128 MB perf.data (2500 samples) ]
perf script -F +pid > script.txt
但是绝对没有显示用户空间函数,只有内核 kallsyms:
我尝试使用和不使用 --privileged 标志运行容器,尝试了 perf record --call-graph dwarf、perf record --call-graph fp,但什么也没有。我清楚地记得只需使用 perf record -g 就能看到功能...我做错了什么?
提前感谢任何帮助这个迷失、绝望的灵魂的人。