推荐一个程序,这几天用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官方网站的
在线文档
相关推荐
无需上下文,MCP新机制让大模型主动“提需”:节约 98% token 开销,并保持准确率基本不变!
值得注意的是,MCP 协议定义的服务器描述通常较为简洁。为了提升匹配效果,我们引入 Qwen2.5-72b-Instruct 模型,对所有服务器的原始资料(通常为 ReadMe 文档)进行总结提炼,参考其 capabilities、features、usage patterns 等要素,生成服务器的 summary 信息,作为相对详尽的描述文本用于匹配。然而,现有的 MCP 调用机制下,所有工具的描述信息都被注入大模型的系统提示词,导致了非常长的上下文开销,也为大模型的表现带来了影响,降低了模型的性能。
应用 Valgrind 发现 Linux 程序的内存问题
如何定位应用程序开发中的内存问题,一直是 inux 应用程序开发中的瓶颈所在。有一款非常优秀的 linux 下开源的内存问题检测工具:valgrind,能够极大的帮助你解决上述问题。掌握 valgrind 的使用以及工作原理,能够有效地定位进而避免应用开发中的内存问题。应用 Valgrind 发现 Linux 程序的内存问题回页首Valgrind 概述体系结构Valgrind是一套Linux下,开
机器学习 线性回归 头歌实训
第1关:简单线性回归与多元线性回归 第2关:线性回归的正规方程解 第3关:衡量线性回归的性能指标 第4关:scikit-learn线性回归实践 - 波斯顿房价预测
Valgrind——memcheck内存泄漏分析
Valgrind的介绍与使用
从零开始:TexLive(Latex)安装与配置全指南
本文提供了一份详尽的TexLive(Latex)安装与配置全指南,旨在帮助用户从零开始快速搭建LaTeX工作环境。内容涵盖从镜像下载、安装步骤详解、环境验证到高效编辑器(如VS Code)配置,并特别强调了中文排版支持与宏包管理,确保用户能顺利处理学术论文等专业文档的排版需求。
Gem5模拟器,详解官网教程Event-driven programming(五)
Gem5模拟器,详解官网教程Event-driven programming、时间调度、如何自定义SimObject
valgrind检测内存泄漏教程
如果命令输出 Valgrind 的版本信息,说明已经成功安装了 Valgrind。如果命令无法识别 valgrind 命令,那么就说明还没有安装 Valgrind 或者环境变量配置不正确。
基于HetConv与Dual策略的YOLOv8轻量化设计-CSPHet结构的优化与实现
在计算机视觉中,YOLOv8作为目标检测领域的最新版本,通过引入多种改进来提升检测精度和速度。然而,提升精度和保持实时性能往往需要更多参数与计算量。本文提出一种结合Dual思想与HetConv的新型轻量化结构,称为CSPHet。CSPHet能够在保持YOLOv8检测精度的基础上有效减少约70万参数量,实现模型的轻量化和速度的提升。HetConv(Heterogeneous Convolution)是一种混合卷积技术,通过同时使用1x1、3x3等不同大小的卷积核,来捕捉不同尺度的特征。
使用valgrind进行内存泄漏检测
使用valgrind进行内存检测工作的记录
2024年数字IC秋招-速腾聚创-数字芯片验证工程师-笔试题
笔试题型:单选 + 问答题笔试平台:牛客(手机+电脑监控)笔试时间:1hA. len取10的概率是1/2;B. len取10的概率是1/3;C. len取10的概率是1/4;D. len取10的概率是1;
亚马逊跨境电商选品数据分析:Python爬虫实战指南
本文将带领大家构建一套完整的亚马逊选品数据采集与分析系统,使用最新的Python技术栈,从零开始爬取亚马逊商品数据,并进行深度分析。
【调试】Valgrind内存泄漏内存越界|运行时间|调用|cache命中率|多线程竞态|堆栈分析
目录 即可即用 简介 Valgrind工具详解 安装 使用 检测内存泄漏 其他内存问题 memcheck 工具的常用选型 其他选项 附录 其他类似工具 即可即用 1、没有安装的先在程序运行的主机上安装,安装教程见:1.4安装。 2、使用: 命令: valgrind--leak-check=full --log-file=leak.log/...
第一章 EB安装
1.DemoWorkspace 是基于EB当前组件配置下的例程,包含了启动文件和中断服务函数以及组件demo。2.Mclsar 下存放的是EB的插件包和静态MCAL的驱动文件。
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
WINCC7.3破解文件
WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!
精雕软件(JDpaint) 5.5 绿色版
精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版
内存检查工具valgrind交叉编译具体流程
valgrind,非常强大的内存检查工具,能检查内存泄漏、越界等。最大的优点是不污染源代码,直接使用即可。ps: sanitizer也很强大,但需要编译器支持,这个局限还是有点大的。
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
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环境当
内存检查工具valgrind介绍、安装与使用
一、valgrind介绍 1、valgrind概述 Valgrind是一套Linux下,开放源代码的仿真调试工具的集合。Valgrind由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。Valgrind的体系结构如下...
内存泄露检查工具valgrind
本文全文转载于:https://blog.youkuaiyun.com/kesalin/article/details/2593958 Valgrind是一个GPL的软件,用于Linux(For x86, amd64 and ppc32)程序的内存调试和代码剖析。你可以在它的环境中运行你的程序来监视内存的使用情况,比如C 语言中的malloc和free或者 C++中的new和 delete。使用Va...
Valgrind内存检查工具
在C/C++开发过程中,内存泄漏是一个非常常见的问题,其影响相对来说远低于coredump等,所以遇到内存泄漏的时候,不用过于着急,大不了重启嘛。良好的编程习惯,只有有malloc/new,就得有free/delete也是最重要的一点,谁申请,谁释放对于malloc分配内存,分配失败的时候返回值为NULL,此时程序可以直接退出了。如果我们上线后,发现程序存在内存泄漏,如果不严重的话,可以先暂时不管线上,同时进行排查定位。在定位问题点的时候,可以采用缩小范围法。
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 应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内
C/C++ 内存泄漏检查工具 valgrind
C/C++ 内存泄漏检查工具 valgrind 前言 因为项目问题,需要使用 HDR 暗光增强。 于是用了已有的 HDR 暗光增强功能,但是在 Android 环境下测试时,发现会遇到以下错误。 由于不是必现,且没有明显的规律,没有有用的信息。 查阅资料说可能是由于 JNI 层的一些非法地址操作,踩坏了 Android 的堆栈内存,导致线程崩溃。 由于前一版程序经过 20 小时的压力测试,所以矛...
valgrind 简介(内存检查工具)
valgrind 简介(内存检查工具)
Valgrind内存泄漏和内存越界访问检查工具
在写C/C++程序时,要小心内存泄漏,内存越界访问,但最粗心的也就是这一块;在程序运行过程中,最担心的也就是突然core掉,或程序占用完内存。此时要么DBG产生的core文件,要么是查看日志再对照源代码,假如此时你的源代码修改过。那就是噩梦了。 Valgrind是一个linux平台的内存调试工具。它允许你在Valgrind自己的环境中运行你的程序,监视内存使用,例如:调用malloc和free(或
内存泄漏检查工具valgrind使用方法
<br />调试内存问题的工具和技术<br />动态内存分配看起来似乎非常简单:您可以根据需要分配内存 —— 使用 malloc() 或其变种 —— 并在不需要时释放这些内存。实际上,内存管理的问题是软件中最为常见的 bug,因为通常在程序启动时这些问题并不明显。例如,程序中的内存泄漏可能开始并不为人注意,直到经过多天甚至几个月的运行才会被发现。接下来的几节将简要介绍如何使用流行的调试器 Valgrind 来发现并调试这些最常见的内存 bug。<br />在开始使用任何调试工具之前,请考虑这个工具是否对重新
1173



被折叠的 条评论
为什么被折叠?



