valgrind内存检查工具

内存泄漏工具valgrind-3.15.zip 内存泄漏工具 使用命令例子,xxx为执行文件 可执行文件目录下执行: valgrind --leak-check=full --show-leak-kinds=all --log-file=log ./xxx 执行后的信息在log文件里。(路径:与exe相同) 立即下载
推荐一个程序,这几天用C语言写了一个程序,跑的数据量小的时候没有什么问题,
当数据量比较大时,总是报错,提示的错误大概是:
***glibc detected*** ... :munmap_chunk(): invalid pointer: 0x08...
在网上google了一下,也有很多人遇到了这个问题,好像是内存和堆栈分配的问题,程
序存在内存泄露。
然后就搜所到了这个比较强大的工具:valgrind。
    

    
用C/C++开发其中最令人头疼的一个问题就是内存管理,有时候为了查找一个内存泄漏或
者一个内存访问越界,需要要花上好几天时间,如果有一款工具能够帮助我们做这件事
情就好了,valgrind正好就是这样的一款工具。

Valgrind是一款基于模拟linux下的程序调试器和剖析器的软件套件,可以运行于x86,
amd64和ppc32架构上。valgrind包含一个核心,它提供一个虚拟的CPU运行程序,还有一
系列的工具,它们完成调试,剖析和一些类似的任务。valgrind是高度模块化的,所以
开发人员或者用户可以给它添加新的工具而不会损坏己有的结构。

valgrind的官方网址是:http://valgrind.org 

你可以在它的网站上下载到最新的valgrind,它是开放源码和免费的。

一、介绍

valgrind包含几个标准的工具,它们是:

1、memcheck

memcheck探测程序中内存管理存在的问题。它检查所有对内存的读/写操作,并截取所有
的malloc/new/free/delete调用。因此memcheck工具能够探测到以下问题:

1)使用未初始化的内存

2)读/写已经被释放的内存

3)读/写内存越界

4)读/写不恰当的内存栈空间

5)内存泄漏

6)使用malloc/new/new[]和free/delete/delete[]不匹配。

2、cachegrind

cachegrind是一个cache剖析器。它模拟执行CPU中的L1, D1和L2 cache,因此它能很精
确的指出代码中的cache未命中。如果你需要,它可以打印出cache未命中的次数,内存
引用和发生cache未命中的每一行代码,每一个函数,每一个模块和整个程序的摘要。如
果你要求更细致的信息,它可以打印出每一行机器码的未命中次数。在x86和amd64上,
cachegrind通过CPUID自动探测机器的cache配置,所以在多数情况下它不再需要更多的
配置信息了。

3、helgrind

helgrind查找多线程程序中的竞争数据。helgrind查找内存地址,那些被多于一条线程
访问的内存地址,但是没有使用一致的锁就会被查出。这表示这些地址在多线程间访问
的时候没有进行同步,很可能会引起很难查找的时序问题。

二、valgrind对你的程序都做了些什么

valgrind被设计成非侵入式的,它直接工作于可执行文件上,因此在检查前不需要重新
编译、连接和修改你的程序。要检查一个程序很简单,只需要执行下面的命令就可以了

valgrind --tool=tool_name program_name

比如我们要对ls -l命令做内存检查,只需要执行下面的命令就可以了

valgrind --tool=memcheck ls -l

不管是使用哪个工具,valgrind在开始之前总会先取得对你的程序的控制权,从可执行
关联库里读取调试信息。然后在valgrind核心提供的虚拟CPU上运行程序,valgrind会根
据选择的工具来处理代码,该工具会向代码中加入检测代码,并把这些代码作为最终代
码返回给valgrind核心,最后valgrind核心运行这些代码。

如果要检查内存泄漏,只需要增加--leak-check=yes就可以了,命令如下

valgrind --tool=memcheck --leak-check=yes ls -l

不同工具间加入的代码变化非常的大。在每个作用域的末尾,memcheck加入代码检查每
一片内存的访问和进行值计算,代码大小至少增加12倍,运行速度要比平时慢25到50倍。

valgrind模拟程序中的每一条指令执行,因此,检查工具和剖析工具不仅仅是对你的应
用程序,还有对共享库,GNU C库,X的客户端库都起作用。

三、现在开始

首先,在编译程序的时候打开调试模式(gcc编译器的-g选项)。如果没有调试信息,即
使最好的valgrind工具也将中能够猜测特定的代码是属于哪一个函数。打开调试选项进
行编译后再用valgrind检查,valgrind将会给你的个详细的报告,比如哪一行代码出现
了内存泄漏。

当检查的是C++程序的时候,还应该考虑另一个选项 -fno-inline。它使得函数调用链很
清晰,这样可以减少你在浏览大型C++程序时的混乱。比如在使用这个选项的时候,用
memcheck检查 openoffice就很容易。当然,你可能不会做这项工作,但是使用这一选项
使得valgrind生成更精确的错误报告和减少混乱。

一些编译优化选项(比如-O2或者更高的优化选项),可能会使得memcheck提交错误的未初
始化报告,因此,为了使得valgrind的报告更精确,在编译的时候最好不要使用优化选项。

如果程序是通过脚本启动的,可以修改脚本里启动程序的代码,或者使用--trace-
children=yes选项来运行脚本。

下面是用memcheck检查ls -l命令的输出报告,在终端下执行下面的命令

valgrind --tool=memcheck ls -l

程序会打印出ls -l命令的结果,最后是valgrind的检查报告如下:

==4187==

==4187== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 19 from 2)

==4187== malloc/free: in use at exit: 15,154 bytes in 105 blocks.

==4187== malloc/free: 310 allocs, 205 frees, 60,093 bytes allocated.

==4187== For counts of detected errors, rerun with: -v

==4187== searching for pointers to 105 not-freed blocks.

==4187== checked 145,292 bytes.

==4187==

==4187== LEAK SUMMARY:

==4187== definitely lost: 0 bytes in 0 blocks.

==4187== possibly lost: 0 bytes in 0 blocks.

==4187== still reachable: 15,154 bytes in 105 blocks.

==4187== suppressed: 0 bytes in 0 blocks.

==4187== Reachable blocks (those to which a pointer was found) are not shown.

==4187== To see them, rerun with: --show-reachable=yes

这里的“4187”指的是执行ls -l的进程ID,这有利于区别不同进程的报告。memcheck会给
出报告,分配置和释放了多少内存,有多少内存泄漏了,还有多少内存的访问是可达
的,检查了多少字节的内存。

下面举两个用valgrind做内存检查的例子

例子一 (test.c):

#include <string.h>

int main(int argc, char *argv[])
{
    char *ptr;

    ptr = (char*) malloc(10);
    strcpy(ptr, "01234567890");

    return 0;
}

编译程序

gcc -g -o test test.c

用valgrind执行命令

valgrind --tool=memcheck --leak-check=yes ./test

报告如下

==4270== Memcheck, a memory error detector.

==4270== Copyright (C) 2002-2006, and GNU GPL'd, by Julian Seward et al.

==4270== Using LibVEX rev 1606, a library for dynamic binary translation.

==4270== Copyright (C) 2004-2006, and GNU GPL'd, by OpenWorks LLP.

==4270== Using valgrind-3.2.0, a dynamic binary instrumentation framework.

==4270== Copyright (C) 2000-2006, and GNU GPL'd, by Julian Seward et al.

==4270== For more details, rerun with: -v

==4270==

==4270== Invalid write of size 1

==4270== at 0x4006190: strcpy (mc_replace_strmem.c:271)

==4270== by 0x80483DB: main (test.c:8)

==4270== Address 0x4023032 is 0 bytes after a block of size 10 alloc'd

==4270== at 0x40044F6: malloc (vg_replace_malloc.c:149)

==4270== by 0x80483C5: main (test.c:7)

==4270==

==4270== Invalid write of size 1

==4270== at 0x400619C: strcpy (mc_replace_strmem.c:271)

==4270== by 0x80483DB: main (test.c:8)

==4270== Address 0x4023033 is 1 bytes after a block of size 10 alloc'd

==4270== at 0x40044F6: malloc (vg_replace_malloc.c:149)

==4270== by 0x80483C5: main (test.c:7)

==4270==

==4270== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 12 from 1)

==4270== malloc/free: in use at exit: 10 bytes in 1 blocks.

==4270== malloc/free: 1 allocs, 0 frees, 10 bytes allocated.

==4270== For counts of detected errors, rerun with: -v

==4270== searching for pointers to 1 not-freed blocks.

==4270== checked 51,496 bytes.

==4270==

==4270==

==4270== 10 bytes in 1 blocks are definitely lost in loss record 1 of 1

==4270== at 0x40044F6: malloc (vg_replace_malloc.c:149)

==4270== by 0x80483C5: main (test.c:7)

==4270==

==4270== LEAK SUMMARY:

==4270== definitely lost: 10 bytes in 1 blocks.

==4270== possibly lost: 0 bytes in 0 blocks.

==4270== still reachable: 0 bytes in 0 blocks.

==4270== suppressed: 0 bytes in 0 blocks.

==4270== Reachable blocks (those to which a pointer was found) are not shown.

==4270== To see them, rerun with: --show-reachable=yes

从这份报告可以看出,进程号是4270,test.c的第8行写内存越界了,引起写内存越界的
是strcpy函数,

第7行泄漏了10个字节的内存,引起内存泄漏的是malloc函数。

例子二(test2.c)

#include <stdio.h>

int foo(int x)
{
    if (x < 0) {
        printf("%d ", x);
    }

    return 0;
}

int main(int argc, char *argv[])
{
    int x;
   
    foo(x);

    return 0;
}

编译程序

gcc -g -o test2 test2.c

用valgrind做内存检查

valgrind --tool=memcheck ./test2

输出报告如下

==4285== Memcheck, a memory error detector.

==4285== Copyright (C) 2002-2006, and GNU GPL'd, by Julian Seward et al.

==4285== Using LibVEX rev 1606, a library for dynamic binary translation.

==4285== Copyright (C) 2004-2006, and GNU GPL'd, by OpenWorks LLP.

==4285== Using valgrind-3.2.0, a dynamic binary instrumentation framework.

==4285== Copyright (C) 2000-2006, and GNU GPL'd, by Julian Seward et al.

==4285== For more details, rerun with: -v

==4285==

==4285== Conditional jump or move depends on uninitialised value(s)

==4285== at 0x8048372: foo (test2.c:5)

==4285== by 0x80483B4: main (test2.c:16)

==4285==p p

==4285== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 1)

==4285== malloc/free: in use at exit: 0 bytes in 0 blocks.

==4285== malloc/free: 0 allocs, 0 frees, 0 bytes allocated.

==4285== For counts of detected errors, rerun with: -v

==4285== All heap blocks were freed -- no leaks are possible.

从这份报告可以看出进程PID是4285,test2.c文件的第16行调用了foo函数,在test2.c
文件的第5行foo函数使用了一个未初始化的变量。

valgrind还有很多使用选项,具体可以查看valgrind的man手册页和valgrind官方网站的
在线文档

内模控制(IMC)——理论、应用与实践 内模控制方法的核心思想是利用被控对象的数学模型(即内模)构建控制器,使得控制器可以“预知”被控系统的动态响应,从而在控制输入中提前补偿模型的固有特性和扰动影响。常见的内模控制结构中,将系统分为无延迟部分和扰动部分,并利用内部模型预测输出值,再通过反馈回路进行误差修正。utuimctufbtutui​mctuf​bt其中,uimctu_imc(t)ui​mct为内模预测得到的预补偿控制量,ufbtu_fb(t)uf​bt。 阅读详情

相关推荐

无需上下文,MCP新机制让大模型主动“提需”:节约 98% token 开销,并保持准确率基本不变!

值得注意的是,MCP 协议定义的服务器描述通常较为简洁。为了提升匹配效果,我们引入 Qwen2.5-72b-Instruct 模型,对所有服务器的原始资料(通常为 ReadMe 文档)进行总结提炼,参考其 capabilities、features、usage patterns 等要素,生成服务器的 summary 信息,作为相对详尽的描述文本用于匹配。然而,现有的 MCP 调用机制下,所有工具的描述信息都被注入大模型的系统提示词,导致了非常长的上下文开销,也为大模型的表现带来了影响,降低了模型的性能。

我爱计算机视觉 1173

应用 Valgrind 发现 Linux 程序的内存问题

如何定位应用程序开发中的内存问题,一直是 inux 应用程序开发中的瓶颈所在。有一款非常优秀的 linux 下开源的内存问题检测工具:valgrind,能够极大的帮助你解决上述问题。掌握 valgrind 的使用以及工作原理,能够有效地定位进而避免应用开发中的内存问题。应用 Valgrind 发现 Linux 程序的内存问题回页首Valgrind 概述体系结构Valgrind是一套Linux下,开

5Love 3780

机器学习 线性回归 头歌实训

第1关:简单线性回归与多元线性回归 第2关:线性回归的正规方程解 第3关:衡量线性回归的性能指标 第4关:scikit-learn线性回归实践 - 波斯顿房价预测

weixin_57270536的博客 1万+

Valgrind——memcheck内存泄漏分析

Valgrind的介绍与使用

qq_46312211的博客 9736

从零开始:TexLive(Latex)安装与配置全指南

本文提供了一份详尽的TexLive(Latex)安装与配置全指南,旨在帮助用户从零开始快速搭建LaTeX工作环境。内容涵盖从镜像下载、安装步骤详解、环境验证到高效编辑器(如VS Code)配置,并特别强调了中文排版支持与宏包管理,确保用户能顺利处理学术论文等专业文档的排版需求。

weixin_29284885的博客 903

Gem5模拟器,详解官网教程Event-driven programming(五)

Gem5模拟器,详解官网教程Event-driven programming、时间调度、如何自定义SimObject

qq_46675545的博客 2040

valgrind检测内存泄漏教程

如果命令输出 Valgrind 的版本信息,说明已经成功安装了 Valgrind。如果命令无法识别 valgrind 命令,那么就说明还没有安装 Valgrind 或者环境变量配置不正确。

MrWangHao的博客 7066

基于HetConv与Dual策略的YOLOv8轻量化设计-CSPHet结构的优化与实现

在计算机视觉中,YOLOv8作为目标检测领域的最新版本,通过引入多种改进来提升检测精度和速度。然而,提升精度和保持实时性能往往需要更多参数与计算量。本文提出一种结合Dual思想与HetConv的新型轻量化结构,称为CSPHet。CSPHet能够在保持YOLOv8检测精度的基础上有效减少约70万参数量,实现模型的轻量化和速度的提升。HetConv(Heterogeneous Convolution)是一种混合卷积技术,通过同时使用1x1、3x3等不同大小的卷积核,来捕捉不同尺度的特征。

博客 1324

使用valgrind进行内存泄漏检测

使用valgrind进行内存检测工作的记录

weixin_44475356的博客 4561

2024年数字IC秋招-速腾聚创-数字芯片验证工程师-笔试题

笔试题型:单选 + 问答题笔试平台:牛客(手机+电脑监控)笔试时间:1hA. len取10的概率是1/2;B. len取10的概率是1/3;C. len取10的概率是1/4;D. len取10的概率是1;

qq_42135020的博客 1399

亚马逊跨境电商选品数据分析:Python爬虫实战指南

本文将带领大家构建一套完整的亚马逊选品数据采集与分析系统,使用最新的Python技术栈,从零开始爬取亚马逊商品数据,并进行深度分析。

2201_76125261的博客 299

【调试】Valgrind内存泄漏内存越界|运行时间|调用|cache命中率|多线程竞态|堆栈分析

目录 即可即用 简介 Valgrind工具详解 安装 使用 检测内存泄漏 其他内存问题 memcheck 工具的常用选型 其他选项 附录 其他类似工具 即可即用 1、没有安装的先在程序运行的主机上安装,安装教程见:1.4安装。 2、使用: 命令: valgrind--leak-check=full --log-file=leak.log/...

我的笔记本 8016

第一章 EB安装

1.DemoWorkspace 是基于EB当前组件配置下的例程,包含了启动文件和中断服务函数以及组件demo。2.Mclsar 下存放的是EB的插件包和静态MCAL的驱动文件。

舊梦的博客 1963

C++内存检查工具valgrind

安装apt-get install valgrind注意在Ubuntu 16.10上,需要python2为默认python版本。运行启动C++程序前加上valgrind即可。valgrind ./builder/bin/wind_tunnel_d -c ./config_pdc.js检查报告C-c C-c退出进程,可以看到如下报告:==16085== Memcheck, a memory erro

Dean Chen的专栏 1828

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

内存检查工具valgrind交叉编译具体流程

valgrind,非常强大的内存检查工具,能检查内存泄漏、越界等。最大的优点是不污染源代码,直接使用即可。ps: sanitizer也很强大,但需要编译器支持,这个局限还是有点大的。

830

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

linux valgrind memCheck ---内存检查工具的可视化方法valkyrie

linux valgrind memCheck —内存检查工具的可视化方法valkyrie linux valgrind Memcheck–内存检查工具 1、安装valgrind valgrind 安装 安装过程没这么复杂。 直接命令行: sudo apt-get install valgrind 2、安装valkyrie valkyrie下载连接: https://launchpad.net/ubuntu/trusty/+search?text=valkyrie 百度云盘链接:https://pa

xianquji1676的博客 1202

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

内存检查工具Valgrind介绍

1         Valgrind简介Valgrind基本原理是让待检查的程序运行在它模拟的cpu上,所以能得到非常详尽的信息,但是会影响到程序的性能,速度有可能下降20倍以上,不过作为开发环境下检查和统计内存使用情况还是不错的。 由于valgrind与cpu和操作系统紧密相关,因此只能够运行在x86/Linux, AMD64/Linux and PPC32/Linux环境当

jlusomeday1979的专栏 1092

内存检查工具valgrind介绍、安装与使用

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

mijichui2153的博客 3万+

内存泄露检查工具valgrind

本文全文转载于:https://blog.youkuaiyun.com/kesalin/article/details/2593958 Valgrind是一个GPL的软件,用于Linux(For x86, amd64 and ppc32)程序的内存调试和代码剖析。你可以在它的环境中运行你的程序来监视内存的使用情况,比如C 语言中的malloc和free或者 C++中的new和 delete。使用Va...

蓬莱道人的博客 542

Valgrind内存检查工具

在C/C++开发过程中,内存泄漏是一个非常常见的问题,其影响相对来说远低于coredump等,所以遇到内存泄漏的时候,不用过于着急,大不了重启嘛。良好的编程习惯,只有有malloc/new,就得有free/delete也是最重要的一点,谁申请,谁释放对于malloc分配内存,分配失败的时候返回值为NULL,此时程序可以直接退出了。如果我们上线后,发现程序存在内存泄漏,如果不严重的话,可以先暂时不管线上,同时进行排查定位。在定位问题点的时候,可以采用缩小范围法。

weixin_57206174的博客 899

valgrind 内存检查工具

valgrind 1. 编译安装 wget https://fossies.org/linux/misc/valgrind-3.15.0.tar.bz2 tar -jxvf valgrind-3.15.0.tar.bz2 cd valgrind-3.15.0 ./configure make sudo make install 2. valgrind包含的工具 Memcheck。这是 valgrind 应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内

Clarence的博客 324

C/C++ 内存泄漏检查工具 valgrind

C/C++ 内存泄漏检查工具 valgrind 前言 因为项目问题,需要使用 HDR 暗光增强。 于是用了已有的 HDR 暗光增强功能,但是在 Android 环境下测试时,发现会遇到以下错误。 由于不是必现,且没有明显的规律,没有有用的信息。 查阅资料说可能是由于 JNI 层的一些非法地址操作,踩坏了 Android 的堆栈内存,导致线程崩溃。 由于前一版程序经过 20 小时的压力测试,所以矛...

描绘自己的王国…… 2688

valgrind 简介(内存检查工具)

valgrind 简介(内存检查工具)

knowledgebao的博客 2886

Valgrind内存泄漏和内存越界访问检查工具

在写C/C++程序时,要小心内存泄漏,内存越界访问,但最粗心的也就是这一块;在程序运行过程中,最担心的也就是突然core掉,或程序占用完内存。此时要么DBG产生的core文件,要么是查看日志再对照源代码,假如此时你的源代码修改过。那就是噩梦了。 Valgrind是一个linux平台的内存调试工具。它允许你在Valgrind自己的环境中运行你的程序,监视内存使用,例如:调用malloc和free(或

cyberspecter的专栏 4197

内存泄漏检查工具valgrind使用方法

<br />调试内存问题的工具和技术<br />动态内存分配看起来似乎非常简单:您可以根据需要分配内存 —— 使用 malloc() 或其变种 —— 并在不需要时释放这些内存。实际上,内存管理的问题是软件中最为常见的 bug,因为通常在程序启动时这些问题并不明显。例如,程序中的内存泄漏可能开始并不为人注意,直到经过多天甚至几个月的运行才会被发现。接下来的几节将简要介绍如何使用流行的调试器 Valgrind 来发现并调试这些最常见的内存 bug。<br />在开始使用任何调试工具之前,请考虑这个工具是否对重新

caohao2008的专栏 2万+
上一篇: Framebuffer how to 编程指导
下一篇: 【趣味数学】24点算法大全
MacroCrazier
博客等级 码龄19年 39粉丝 26原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值