跳转到内容

Valgrind

Valgrind 是一个用于内存调试、内存泄漏检测和性能分析的开源工具集。

Terminal window
valgrind [选项] ./程序 [程序参数]

Valgrind 包含多个工具,通过 --tool=<工具名> 选择,最常用的有:

工具 用途
Memcheck 内存错误检测器(默认)
Cachegrind 缓存和分支预测分析器
Callgrind 调用图分析器
Massif 堆分析器
Helgrind 线程错误检测器
选项 说明
--leak-check=<no|summary|yes|full> 控制内存泄漏检测的详细程度(推荐 full)
--show-leak-kinds=<kindset> 指定要显示的内存泄漏类型
--track-origins=<yes|no> 是否追踪未初始化变量的来源(默认 no)
--errors-for-leak-kinds=<kinds> 指定哪些泄漏类型应被视为错误

--show-leak-kinds 支持的泄漏类型:

  • definite:肯定泄漏(程序无法访问的内存)
  • possible:可能泄漏(指针指向内存块中间)
  • indirect:间接泄漏(通过其他泄漏内存访问)
  • reachable:仍可访问(程序结束时仍有指针指向)
  • all:所有类型
选项 说明
--log-file=<filename> 将输出重定向到文件
--error-exitcode=<number> 发现错误时返回指定退出码
--num-callers=N 设置调用栈回溯深度(默认 12,复杂程序可增大)

编译并检测内存泄漏:

Terminal window
# 编译时加上 -g 以获取调试信息
gcc -g -o program program.c
# 使用 Memcheck 进行完整检测
valgrind --leak-check=full \
--show-leak-kinds=all \
--track-origins=yes \
--error-exitcode=1 \
./program

将检测结果输出到文件:

Terminal window
valgrind --leak-check=full \
--log-file=valgrind.log \
./program