Linux 下利用 Valgrind 进行内存调试


一、概述

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 工具集中一些常用的工具:

  1. Memcheck:这是 Valgrind 最常用的工具之一,用于检测程序中的内存错误,例如内存泄漏、未初始化的内存读取、非法内存访问等。
  2. Cachegrind:用于模拟缓存和分支预测器的行为,帮助优化程序的缓存使用和执行路径。
  3. Callgrind:用于程序性能分析,跟踪函数调用关系和执行次数,帮助找出程序中的性能瓶颈。
  4. Helgrind:专门用于检测多线程程序中的并发错误,如数据竞争、死锁等问题。
  5. Massif:用于分析程序的堆内存使用情况,包括堆分配、释放和堆内存的快照。
  6. DHAT (Dynamic Heap Analysis Tool):用于深入分析程序的堆内存分配情况,帮助找出内存分配和使用方面的问题。
  7. BBV(Basic Block Vectors):可用于收集程序中基本块的统计信息,帮助理解程序的执行路径和性能特征。

每个工具都有其特定的用途和优势,可以根据需要选择合适的工具来进行程序调试、性能优化或内存分析。

接下来主要是介绍 Memcheck 工具的使用。

3、Memcheck

Valgrind 在内存检测方面主要有四个使用场景:

  1. 使用未初始化的内存
  2. 内存泄漏
  3. 在内存被释放后进行读/写
  4. 内存块的尾部进行读/写

3.1 使用未初始化的内存

首先看一个例子:

#include <stdio.h>
#include <stdlib.h>

int main(){
   
    char *p;
    char c = *p;

    printf("\n [%c]\n", c);

    return 0;
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值