valgrind工具的使用

valgrind是什么?

Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。Valgrind由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内调试任务。Valgrind的体系结构如下图所示:

valgrind的结构图
在这里插入图片描述

Valgrind包括如下一些工具
Memcheck。这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等。这也是本文将重点介绍的部分。

Callgrind。它主要用来检查程序中函数调用过程中出现的问题。

Cachegrind。它主要用来检查程序中缓存使用出现的问题。

Helgrind。它主要用来检查多线程程序中出现的竞争问题。

Massif。它主要用来检查程序中堆栈使用中出现的问题。

Extension。可以利用core提供的功能,自己编写特定的内存调试工具

Valgrind的安装

  1. 上传 valgrind-3.15.0.tar.bz2 到linux的用户目录(使用root权限,有安装软件权限)。并解压
tar -jxvf valgrind-3.15.0.tar.bz2

在这里插入图片描述
2. 进入目录进行安装

cd valgrind-3.20.0
./configure
make
make install

3.检测安装是否成功
valgrind –h 显示valgrind的参数及提示,说明安装成功

valgrind –h

在这里插入图片描述

Valgrind的使用

我们写一个有内存泄漏的demo,并在linux环境上进行编译,挂上Valgrind进行运行,看Valgrind 是否能检测出问题。

  1. 编写一个valgrind_demo.cpp,内容如下
#include <iostream>
#include <vector>

int main()
{
    std::vector<long long> vec(100000000);
    vec[0] = 1;
    vec[1] = 2;

    // 动态分配一个包含 10000 个 int 元素的数组,并初始化
    int* testb = new int[40000];
    for (long long i = 0; i < 40000; ++i) {
        testb[i] = i + 1;  // 初始化数组元素
    }
    // 不释放 testb 数组
    return 0;
}

  1. 上传到服务器进行编译:
 g++ -o valgrind_demo -std=c++11 valgrind_demo.cpp

在这里插入图片描述
3. 使用Valgrind启动该程序,将内存检测结果输出到文件中

valgrind --tool=memcheck --log-file=mzc_check --leak-check=full --show-reachable=yes ./valgrind_demo

命令详细解释:

--tool=memcheck:
	指定使用 memcheck 工具。memcheck 是 Valgrind 的默认工具,用于检测内存错误,如内存泄漏、未初始化内存访问等。
--log-file=mzc_check:
	将 Valgrind 的输出重定向到 mzc_check 文件中。这样可以方便地查看和分析 Valgrind 的报告。
--leak-check=full:
	启用详细的内存泄漏检查。full 表示生成详细的泄漏报告,包括所有类型的泄漏(直接泄漏、间接泄漏、可能泄漏和可访问但未释放的内存)。
--show-reachable=yes:
	显示在程序结束时仍然可访问但未释放的内存块。这有助于检查那些虽然没有泄漏但仍然占用内存的资源。
./valgrind_demo:
	运行你编译后的可执行文件 valgrind_demo。

在这里插入图片描述

  1. 查看文件,定位问题
vim mzc_check

在这里插入图片描述

Valgrind的参数解释

用法: valgrind [options] prog-and-args [options]: 常用选项,适用于所有Valgrind工具
-tool= 最常用的选项。运行 valgrind中名为toolname的工具。默认memcheck。
h –help 显示帮助信息。
-version 显示valgrind内核的版本,每个工具都有各自的版本。
q –quiet 安静地运行,只打印错误信息。
v –verbose 更详细的信息, 增加错误数统计。
-trace-children=no|yes 跟踪子线程? [no]
-track-fds=no|yes 跟踪打开的文件描述?[no]
-time-stamp=no|yes 增加时间戳到LOG信息? [no]
-log-fd= 输出LOG到描述符文件 [2=stderr]
-log-file= 将输出的信息写入到filename.PID的文件里,PID是运行程序的进行ID
-log-file-exactly= 输出LOG信息到 file
-log-file-qualifier= 取得环境变量的值来做为输出信息的文件名。 [none]
-log-socket=ipaddr:port 输出LOG到socket ,ipaddr:port
LOG信息输出
-xml=yes 将信息以xml格式输出,只有memcheck可用
-num-callers= show callers in stack traces [12]
-error-limit=no|yes 如果太多错误,则停止显示新错误? [yes]
-error-exitcode= 如果发现错误则返回错误代码 [0=disable]
-db-attach=no|yes 当出现错误,valgrind会自动启动调试器gdb。[no]
-db-command= 启动调试器的命令行选项[gdb -nw %f %p]
适用于Memcheck工具的相关选项:
-leak-check=no|summary|full 要求对leak给出详细信息? [summary]
-leak-resolution=low|med|high how much bt merging in leak check [low]
-show-reachable=no|yes show reachable blocks in leak check? [no]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

良缘白马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值