2、环境搭建:在Ubuntu和Windows上安装性能分析工具链

好,咱们直接进入正题。环境搭建这事儿,说简单也简单,说坑也多。我见过不少新手,工具装到一半就卡住了,最后发现是源没配好,或者路径没加对。所以这一章,我带你一步步把 perfgprofValgrind 这三件套装好。Ubuntu 和 Windows 我都会讲,你按自己的系统来就行。

2.1 为什么是这三件套?

先简单说下为什么选它们。你想想看,做嵌入式 GUI 性能分析,你至少需要三类数据:

  • CPU 热点:哪段代码最耗 CPU?—— perf 干这个。
  • 函数调用次数与耗时:哪个函数被调了上万次?—— gprof 干这个。
  • 内存泄漏与缓存问题:内存是不是偷偷涨了?—— Valgrind 干这个。

这三样东西配合起来,基本能覆盖 90% 的性能问题。我个人习惯是先用 perf 扫一遍,发现热点函数后,再用 gprof 深入看调用关系,最后用 Valgrind 检查内存。嗯,这个流程我用了好几年,挺顺手的。

2.2 Ubuntu 上的安装

Ubuntu 下安装这些工具,说白了就是几条 apt 命令。但有几个细节要注意,我踩过坑的地方会特别提醒你。

2.2.1 安装 perf

perf 是 Linux 内核自带的工具,但默认没装全。你需要装 linux-tools 包:

sudo apt update
sudo apt install linux-tools-common linux-tools-generic linux-tools-$(uname -r)

装完后,跑一下 perf --version 看看。如果提示 WARNING: perf not found for kernel ...,别慌。我曾经也被这个警告坑过,后来发现是内核头文件没对齐。解决办法是:

sudo apt install linux-headers-$(uname -r)

然后重新装一遍 linux-tools。嗯,这里要注意,每次升级内核后,最好重新执行一次上面的命令,否则 perf 可能罢工。

小技巧: 如果你在虚拟机里跑 Ubuntu,记得给虚拟机分配至少 2 个 CPU 核心,否则 perf 的采样结果会不准。我在 VMware 上吃过这个亏,采样出来的热点全是 idle 线程。

2.2.2 安装 gprof

gprof 是 GNU 工具链的一部分,通常已经随 gcc 装好了。你只需要确认一下:

gcc --version
gprof --version

如果没装 gcc,那就:

sudo apt install build-essential

build-essential 会一并把 gcc、g++、make、gprof 都装好。我个人建议你装这个包,因为后面编译嵌入式 GUI 程序时,make 和 gcc 都是必需品。

注意: gprof 需要你在编译时加 -pg 选项,否则它不会生成分析数据。这个很多人会忘,包括我刚开始用的时候也漏过。后面章节我会详细讲编译参数。

2.2.3 安装 Valgrind

Valgrind 的安装最简单:

sudo apt install valgrind

装完后验证:

valgrind --version

如果版本号出来了,就说明装好了。Valgrind 在 Ubuntu 上基本不会出问题,但有一个坑:它默认只支持 x86 和 ARM 架构。如果你用的是 RISC-V 或 MIPS 的交叉编译环境,Valgrind 可能跑不了。我在一个 RISC-V 板子上试过,折腾了半天,最后只能用 perf 替代。

2.3 Windows 上的安装

Windows 下装这些工具稍微麻烦点,因为它们是 Linux 原生工具。但别担心,有两种主流方案:WSL2MSYS2。我个人更推荐 WSL2,因为它和 Ubuntu 环境几乎一样,后面你写脚本、做自动化分析都方便。

2.3.1 方案一:WSL2(推荐)

首先,确保你的 Windows 10/11 开启了 WSL2 功能。打开 PowerShell(管理员),运行:

wsl --install -d Ubuntu-22.04

装完后重启,进入 Ubuntu 终端。然后按照上面 2.2 节的步骤,在 WSL2 里安装 perf、gprof、Valgrind。说白了,WSL2 里的操作和原生 Ubuntu 一模一样。

提示: 如果你在 WSL2 里用 perf,记得把 Windows 的杀毒软件暂时关掉,或者把 WSL2 的进程加入白名单。我曾经被 Windows Defender 拦截过 perf 的采样,导致 perf record 一直报 permission denied

2.3.2 方案二:MSYS2(备选)

如果你不想用 WSL2,或者需要原生 Windows 二进制文件,可以用 MSYS2。它提供了一个类 Linux 的终端环境。

安装步骤:

  1. 从官网下载 MSYS2 安装包,一路默认安装。
  2. 打开 MSYS2 UCRT64 终端,更新包管理器:
pacman -Syu
  1. 安装工具链:
pacman -S mingw-w64-ucrt-x86_64-gcc
pacman -S mingw-w64-ucrt-x86_64-gprof
pacman -S mingw-w64-ucrt-x86_64-valgrind

注意:MSYS2 里没有 perf,因为 perf 依赖 Linux 内核特性。如果你需要 CPU 热点分析,建议用 WSL2 方案,或者用 Windows 上的 Windows Performance Toolkit(WPT)替代。不过 WPT 和 perf 的输出格式不同,后面分析时得手动转换一下。

避坑指南: 我曾经在 MSYS2 里用 Valgrind 分析一个 GUI 程序,结果跑了一分钟就崩溃了。后来发现是 MSYS2 的线程模型和 Valgrind 不兼容。所以,如果你做嵌入式 GUI 的性能分析,我建议优先用 WSL2,实在不行再用 MSYS2。

2.4 验证安装是否成功

装完别急着走,咱们做个快速验证。写一个简单的 C 程序,测试三个工具能不能正常工作。

创建一个文件 test_perf.c

#include <stdio.h>

void busy_loop() {
    for (volatile int i = 0; i < 100000000; i++);
}

int main() {
    printf("Testing perf, gprof, Valgrind...\n");
    busy_loop();
    return 0;
}

然后依次测试:

# 测试 perf
gcc -o test_perf test_perf.c
perf stat ./test_perf

# 测试 gprof(注意加 -pg)
gcc -pg -o test_gprof test_perf.c
./test_gprof
gprof test_gprof gmon.out

# 测试 Valgrind
valgrind --tool=memcheck ./test_perf

如果每个命令都能正常输出结果,没有报错,那就说明环境搭好了。嗯,这里要注意,gprof 第一次跑完后,会在当前目录生成 gmon.out 文件,别手欠删了。

2.5 我的一点建议

环境搭建这一步,说白了就是「磨刀不误砍柴工」。我见过有人花三天装环境,结果发现是网络源的问题。所以我的建议是:

  • Ubuntu 用户:直接用 apt,别自己编译源码,除非你有特殊需求。
  • Windows 用户:优先 WSL2,别在 MSYS2 上浪费时间,除非你真的很熟悉它。
  • 交叉编译环境:如果你是在 ARM 板子上做嵌入式 GUI 开发,记得在宿主机上装好交叉编译工具链,然后在目标板上装 perf 和 Valgrind。gprof 可以在宿主机上分析,但编译时得用交叉编译器加 -pg 选项。

好了,环境搭好了,下一章咱们就开始真正用这些工具分析 GUI 性能了。到时候我会拿一个实际的嵌入式 GUI 程序做演示,你跟着跑一遍,很快就能上手。