目录
一、概述
Valgrind
是一个开源的内存调试和性能分析工具,用于帮助开发者找出程序中的内存错误,如内存泄漏、使用未初始化的内存、非法内存访问等问题。它在 Linux 平台上广泛使用,并且支持下多种处理器架构。
二、Valgrind 的使用
1、基本格式
valgrind --tool=memcheck -–gen-suppressions=all -–show-leak-kinds=all --log-file=<filename> --leak-check=yes ./your_app arg1 arg2...
- valgrind:这是一个内存调试工具集,其中的
memcheck
是其中的一个工具,它用于检查内存相关的错误。 - -–gen-suppressions=all:误报是内存泄漏排查中的常见现象。使用该参数,我们可以标记那些误报,生成抑制规则,让
Valgrind
在后续的检查中忽略这些特定的情况。 - –show-leak-kinds=all:显示所有的内存泄漏信息。
- –log-file=<filename>:这是一个选项,用于指定
Valgrind
输出的日志文件的文件名。你可以将<filename>
替换为你想要的文件名或路径。 - –leak-check=yes:这个选项告诉
Valgrind
在程序运行结束后检查内存泄漏。它将会列出程序中存在的任何未释放的内存。(还有一种写法:--leak-check=full
,意思是一样的) - ./your_app:这里应该是你要检查的可执行文件的路径。将
your_app
替换为你的程序的实际名称。 - arg1 arg2…:这些是你的程序可能需要的命令行参数。用空格分隔,替换为你程序实际需要的参数。
2、Valgrind 工具集
Valgrind
工具集包含多个工具,每个工具都针对不同的调试、分析和性能优化任务。以下是 Valgrind
工具集中一些常用的工具:
- Memcheck:这是
Valgrind
最常用的工具之一,用于检测程序中的内存错误,例如内存泄漏、未初始化的内存读取、非法内存访问等。 - Cachegrind:用于模拟缓存和分支预测器的行为,帮助优化程序的缓存使用和执行路径。
- Callgrind:用于程序性能分析,跟踪函数调用关系和执行次数,帮助找出程序中的性能瓶颈。
- Helgrind:专门用于检测多线程程序中的并发错误,如数据竞争、死锁等问题。
- Massif:用于分析程序的堆内存使用情况,包括堆分配、释放和堆内存的快照。
- DHAT (Dynamic Heap Analysis Tool):用于深入分析程序的堆内存分配情况,帮助找出内存分配和使用方面的问题。
- BBV(Basic Block Vectors):可用于收集程序中基本块的统计信息,帮助理解程序的执行路径和性能特征。
每个工具都有其特定的用途和优势,可以根据需要选择合适的工具来进行程序调试、性能优化或内存分析。
接下来主要是介绍 Memcheck
工具的使用。
3、Memcheck
Valgrind
在内存检测方面主要有四个使用场景:
- 使用未初始化的内存
- 内存泄漏
- 在内存被释放后进行读/写
- 内存块的尾部进行读/写
3.1 使用未初始化的内存
首先看一个例子:
#include <stdio.h>
#include <stdlib.h>
int main(){
char *p;
char c = *p;
printf("\n [%c]\n", c);
return 0;