WSL2 中安装 perf

https://juanjose.garciaripoll.com/blog/installing-perf-on-WSL2/index.html

参考这个教程,直接下载 perf 并编译,编译报错。

https://gist.github.com/abel0b/b1881e41b9e1c4b16d84e5e083c38a13

从 WSL2 的仓库附属代码编译 perf。注意找到和自己内核版本对应的源码,可以用 uname -a 来查看自己的内核版本。

git clone https://github.com/microsoft/WSL2-Linux-Kernel.git \
    --branch linux-msft-wsl-5.15.y --depth 1

把评论区的这些包也安装一下:

sudo apt install libdwarf-dev libelf-dev libnuma-dev libunwind-dev \
    libnewt-dev libdwarf++0 libelf++0 libdw-dev libbfb0-dev \
    systemtap-sdt-dev libssl-dev libperl-dev python-dev-is-python3 \
    binutils-dev libiberty-dev libzstd-dev libcap-dev libbabeltrace-dev

还是会编译报错。

重新下载主分支并编译。主分支的内核版本会新一点,虽然很多内核的头文件对不上(对 ABI 有影响),但是没有编译错误了。也许是微软还没有处理 5.15 内核版本在 GCC 更新之后的带来的新的警告吧(-Werror 将警告转换成错误)。

现在运行找不到动态链接库:

$ ./perf --help
./perf: error while loading shared libraries: libcrypt.so.2: cannot open shared object file: No such file or directory

试了几个都是 conda 里面的,于是我退出 conda 环境重新编译就好了。

目前还没发现 ABI 变化导致的错误,运行 perf recordperf report 都是正常的。常用命令:

$ perf record ./executable
... # 这里会运行可执行文件,并且生成一个名为 perf.data 的文件
$ perf report --demangle
... # 这里会在终端中显示不同函数运行占用的 CPU 时间

2025 年 2 月 28 日:版本更新之后又编译不了了。可以试试这个 https://stackoverflow.com/a/65276025/ ,从 linux-tools-generic 的路径中去找 perf,比如 /usr/lib/linux-tools/<linux-version>-generic/perf