pref安装使用

说明

pref是调试工具

安装

正常的发行版的ubuntu系统

sudo apt update
sudo apt install -y linux-tools-common linux-tools-generic

嵌入式系统&自己编译

cd [sdk]/kernel/tools/perf

# 先装编译依赖(Ubuntu)
sudo apt install -y flex bison libdw-dev libunwind-dev libslang2-dev \
    libnuma-dev libssl-dev libelf-dev zlib1g-dev libbfd-dev \
    libtracefs-dev libtraceevent-dev

# 编译
make -j$(nproc)

编译

cd [SDK]

export RK_TOOLCHAIN=$PWD/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin
export PATH=$RK_TOOLCHAIN:$PATH

export ARCH=arm64
export CROSS_COMPILE=aarch64-none-linux-gnu-

mkdir -p /tmp/perf-arm64

编译命令

make -C kernel-6.1/tools/perf O=/tmp/perf-arm64 -j$(nproc) \
    WERROR=0 \
    NO_LIBELF=1 NO_DWARF=1 NO_LIBUNWIND=1 NO_LIBNUMA=1 \
    NO_LIBAUDIT=1 NO_SLANG=1 NO_LZMA=1 NO_LIBBFD=1 \
    NO_LIBPYTHON=1 NO_LIBPERL=1 NO_JVMTI=1 NO_GETTEXT=1 \
    NO_ZLIB=1

使用

perf list | grep spi

#抓取spi相关的

perf trace -a \
    -e 'spi:spi_transfer_start' \
    -e 'spi:spi_transfer_stop' \
    sleep 60

额外

用内核自带 ftrace

例子:读取spi相关

# 挂载 tracefs
mount -t tracefs tracefs /sys/kernel/tracing

# 打开 spi 相关 tracepoint
sh -c 'echo 1 > /sys/kernel/tracing/events/spi/spi_transfer_start/enable'
sh -c 'echo 1 > /sys/kernel/tracing/events/spi/spi_transfer_stop/enable'

# 观察 30 秒
sleep 30

# 停止并查看
sh -c 'echo 0 > /sys/kernel/tracing/events/spi/spi_transfer_start/enable'
sh -c 'echo 0 > /sys/kernel/tracing/events/spi/spi_transfer_stop/enable'
cat /sys/kernel/tracing/trace

日志:

root@ubuntu:~# cat /sys/kernel/tracing/trace
# tracer: nop
#
# entries-in-buffer/entries-written: 12/12   #P:8
#
#                                _-----=> irqs-off/BH-disabled
#                               / _----=> need-resched
#                              | / _---=> hardirq/softirq
#                              || / _--=> preempt-depth
#                              ||| / _-=> migrate-disable
#                              |||| /     delay
#           TASK-PID     CPU#  |||||  TIMESTAMP  FUNCTION
#              | |         |   |||||     |         |
     kworker/0:1-9845    [000] ..... 14802.005293: spi_transfer_start: spi4.0 00000000d20a0a4d len=9 tx=[b0-10-04-00-00-00-00-00-00] rx=[7f-ff-ff-0f-69-30-94-0a-bd]
     kworker/1:2-9162    [001] ..... 14802.005293: spi_transfer_start: spi0.0 000000005792a6d2 len=9 tx=[b0-10-04-00-00-00-00-00-00] rx=[00-00-00-8c-14-3b-94-0a-a5]
     kworker/1:2-9162    [001] ..... 14802.005344: spi_transfer_stop: spi0.0 000000005792a6d2 len=9 tx=[b0-10-04-00-00-00-00-00-00] rx=[00-00-00-dd-90-a7-ff-9d-9e]
     kworker/0:1-9845    [000] ..... 14802.005346: spi_transfer_stop: spi4.0 00000000d20a0a4d len=9 tx=[b0-10-04-00-00-00-00-00-00] rx=[7f-ff-ff-8e-a6-9c-ff-78-3e]
     kworker/0:1-9845    [000] ..... 14847.061386: spi_transfer_start: spi4.0 00000000d20a0a4d len=9 tx=[b0-10-04-00-00-00-00-00-00] rx=[7f-ff-ff-8e-a6-9c-ff-78-3e]
     kworker/1:2-9162    [001] ..... 14847.061386: spi_transfer_start: spi0.0 000000005792a6d2 len=9 tx=[b0-10-04-00-00-00-00-00-00] rx=[00-00-00-dd-90-a7-ff-9d-9e]
     kworker/1:2-9162    [001] ..... 14847.061439: spi_transfer_stop: spi0.0 000000005792a6d2 len=9 tx=[b0-10-04-00-00-00-00-00-00] rx=[00-00-00-e8-0a-14-6b-bb-2e]
     kworker/0:1-9845    [000] ..... 14847.061439: spi_transfer_stop: spi4.0 00000000d20a0a4d len=9 tx=[b0-10-04-00-00-00-00-00-00] rx=[7f-ff-ff-b8-e2-08-6b-be-16]
     kworker/0:1-9845    [000] ..... 14892.117460: spi_transfer_start: spi4.0 00000000d20a0a4d len=9 tx=[b0-10-04-00-00-00-00-00-00] rx=[7f-ff-ff-b8-e2-08-6b-be-16]
     kworker/1:2-9162    [001] ..... 14892.117460: spi_transfer_start: spi0.0 000000005792a6d2 len=9 tx=[b0-10-04-00-00-00-00-00-00] rx=[00-00-00-e8-0a-14-6b-bb-2e]
     kworker/0:1-9845    [000] ..... 14892.117512: spi_transfer_stop: spi4.0 00000000d20a0a4d len=9 tx=[b0-10-04-00-00-00-00-00-00] rx=[7f-ff-ff-f5-1c-75-d6-5b-98]
     kworker/1:2-9162    [001] ..... 14892.117513: spi_transfer_stop: spi0.0 000000005792a6d2 len=9 tx=[b0-10-04-00-00-00-00-00-00] rx=[00-00-00-f0-81-80-d6-2a-30]

strip减少体积

aarch64-none-linux-gnu-strip /tmp/perf-arm64/perf

strip = 删掉“符号表 + 调试信息”,体积变小,程序照常跑,只是不好调试了

perf

perf list 本身会把 perf 支持的事件全部列出来,包括:

  • hardware 事件(CPU cycles 等)
  • software 事件(context switches 等)
  • tracepoint 事件(内核各个子系统埋的点)
  • 等等
posted @ 2026-09-09 15:44  杨旭0324  阅读(6)  评论(0)    收藏  举报