admin管理员组

文章数量:1130349

目录

  • 一、概述
  • 二、Valgrind 的使用
    • 1、基本格式
    • 2、Valgrind 工具集
    • 3、Memcheck
      • 3.1 使用未初始化的内存
      • 3.2 内存泄漏
      • 3.3 在内存被释放后进行读/写
      • 3.4 内存块的尾部进行读/写
    • 4、常见错误
  • 三、分析内存泄漏的使用技巧
    • 1、Valgrind 协调 GDB 工作
    • 2、利用 /proc 定位问题
    • 3、使用 top、ps 识别异常进程
      • 3.1 使用 top
      • 3.2 使用 ps


一、概述

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;
}

目录

  • 一、概述
  • 二、Valgrind 的使用
    • 1、基本格式
    • 2、Valgrind 工具集
    • 3、Memcheck
      • 3.1 使用未初始化的内存
      • 3.2 内存泄漏
      • 3.3 在内存被释放后进行读/写
      • 3.4 内存块的尾部进行读/写
    • 4、常见错误
  • 三、分析内存泄漏的使用技巧
    • 1、Valgrind 协调 GDB 工作
    • 2、利用 /proc 定位问题
    • 3、使用 top、ps 识别异常进程
      • 3.1 使用 top
      • 3.2 使用 ps


一、概述

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;
}

本文标签: 内存LinuxValgrind