环境准备:工欲善其事,必先利其器

做内存泄漏检测,说白了就是跟程序里的「隐形漏洞」打交道。你想想看,代码跑着跑着内存越占越多,最后系统崩了——这种问题我遇到过太多次了。所以这一章,咱们先把环境搭好。

我个人习惯用 Linux 虚拟机来做这件事。为什么?因为 Valgrind 在 Linux 上表现最好,而且虚拟机快照一恢复,环境就干干净净,特别适合反复测试。

Linux 虚拟机安装

我推荐用 Ubuntu 22.04 LTS 或 CentOS 7/8。Ubuntu 的包管理更友好,适合新手。CentOS 则更贴近生产环境。

安装步骤其实很简单:

  1. 下载 VirtualBox 或 VMware Workstation
  2. 下载 Ubuntu 22.04 的 ISO 镜像
  3. 新建虚拟机,分配 2 核 CPU、4GB 内存、20GB 磁盘
  4. 挂载 ISO,启动安装
  5. 一路默认选项,设置好用户名密码
我的小技巧: 装完系统后,先拍个快照。万一后面搞坏了,一键恢复,省得重装。

GCC/G++ 编译器安装

GCC 是咱们吃饭的家伙。Ubuntu 下安装特别简单:

sudo apt update
sudo apt install build-essential gdb

验证一下版本:

gcc --version
g++ --version

我见过不少新手装完 GCC 就直接开干,结果编译出来的程序没有调试信息,Valgrind 根本没法定位源码行号。所以这里要强调:编译时一定要加 -g 选项。

核心要点: 调试信息是 Valgrind 的「眼睛」。没有 -g,它只能告诉你「某地址泄漏了」,但不知道是哪行代码干的。

Valgrind 工具安装

Valgrind 是咱们这节课的主角。安装命令:

sudo apt install valgrind

验证安装:

valgrind --version

如果看到版本号(比如 3.19.0),就说明装好了。

注意: 我曾经在 CentOS 上用 yum 安装 Valgrind,结果版本太老(3.15 以下),有些新特性不支持。建议从源码编译最新版,或者用 Ubuntu 的 apt 源。

知识体系一览

下面这张图,帮你理清环境准备的核心逻辑:

环境准备知识体系 Linux 虚拟机 GCC/G++ 编译器 Valgrind 工具 Ubuntu 22.04 LTS VirtualBox / VMware build-essential 包 -g 调试选项 apt install valgrind --leak-check=full 三者缺一不可,构成完整的内存泄漏检测环境

验证环境是否就绪

装完别急着走,写个简单程序测试一下:

// test_leak.c
#include <stdlib.h>

int main() {
    int *p = (int*)malloc(10 * sizeof(int));
    // 故意不 free,模拟泄漏
    return 0;
}

编译并检测:

gcc -g -o test_leak test_leak.c
valgrind --leak-check=full ./test_leak

如果看到类似这样的输出,说明环境就绪了:

==12345== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
==12345==    at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==12345==    by 0x10915E: main (test_leak.c:5)

嗯,这里要注意: 输出里的「definitely lost」就是明确的内存泄漏。40 bytes 对应 malloc(10 * sizeof(int)),10 个 int 正好 40 字节(在 64 位系统上)。

避坑指南

  • 我曾经 在虚拟机里分配了 512MB 内存,结果 Valgrind 跑大程序时直接 OOM。建议至少 2GB。
  • 我曾经 忘记装 g++,结果 C++ 项目编译不过。记得 build-essential 包含了 g++。
  • 我曾经 用 root 用户跑 Valgrind,结果权限问题导致检测不准。用普通用户就好。

好了,环境准备好了。下一节咱们就开始写第一个带内存泄漏的 C 程序,然后用 Valgrind 抓它个现行。


可可精品资料库