首页 > 系统相关 >valgrind内存检测工具安装

valgrind内存检测工具安装

时间:2022-12-26 15:12:13浏览次数:62  
标签:-- local make valgrind 内存 检测工具 安装 usr

参考:https://blog.csdn.net/xiaoxiaofeng001/article/details/88675841

简单介绍

  • Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。
  • Valgrind这个名字取自北欧神话中英灵殿的入口。
  • Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Google-O'Reilly开源代码奖。
  • Valgrind遵守GNU通用公共许可证条款,是一款自由软件。
  • 到3.3.0版本为止,Valgrind支持x86、x86-64以及PowerPC上的Linux。除此之外,还有一些其它非正式支持的类Unix平台(如FreeBSD、NetBSD以及Mac OS X)。

个人使用的原因

在公司开发好一个程序(linux系统下的qt程序)后,进入测试阶段,发现在运行过程中,内存泄露情况及其严重,通过检查逐句检查代码(new、free、malloc、delete、析构、while循环等地方),修改了一大部分后,再次测试发现内存泄露还是存在,于是看到QT软件有一个Valgrind内存泄露检测工具,进而尝试去使用工具协助检测。
image

但是终端报警告:

valgrind --child-silent-after-fork=yes --xml-socket=127.0.0.1:45500 --log-socket=127.0.0.1:39589 --xml=yes --smc-check=stack --tool=memcheck --gen-suppressions=all --track-origins=yes --leak-check=summary --num-callers=25 
Failed to start program.Path or permissions wrong?
Analyzing finished.

具体原因:Valgrind工具没有安装。

安装Valgrind

  1. 命令安装
sudo apt-get install valgrind

但是本人在命令安装时报错:

you want to continue? [Y/n] y
Err:1 http://mirrors.ustc.edu.cn/debian stable/main arm64 libc6-dbg arm64 2.28-10
  404  Not Found [IP: 202.141.160.110 80]
E: Failed to fetch http://mirrors.ustc.edu.cn/debian/pool/main/g/glibc/libc6-dbg_2.28-10_arm64.deb  404  Not Found [IP: 202.141.160.110 80]
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?

估计时软件源的问题,但是我使用的系统不能轻易更换软件源,所以使用另外一种方法。
2. 在windows系统下载好安装包后(下载地址:https://valgrind.org/downloads/current.html),发送到linux系统安装
image

  • 上面应用发送到linux系统指定目录下后,解压,得到valgrind-3.20.0文件夹,里面包含一些.sh配置文件:
tar -xvf valgrind-3.20.0.tar
  • 进入valgrind-3.20.0目录,运行以下命令:
./autogen.sh (在对应的目录下执行命令)
./configure --prefix=/usr/local/valgrind    (此处为“ 配置 ”操作,--prefix后面为自己指定的配置路径)
make -j8           (此处为“ 编译 ”操作,消耗很多时间,可以添加-j8,使用多核CPU的8个核心来编译,速度会变快)
make install    (此处为“ 安装 ”操作)
make install-recursive
  • 把valgrind的bin目录路径添加到环境变量PATH中,打开~.bashrc(或者/etc/profile)文件,在最后一行加入
PATH=${PATH}:/usr/local/valgrind/bin
  • 执行如下命令:
cd ~    (隐藏文件.bashrc在家目录~)
vi .bashrc   

(或者 vi /etc/profile)
  • 然后在最后一行加入上述环境变量,如下图所示:
    image

  • 刷新一下配置文件:source /etc/profile 或者 source .bashrc。执行valgrind --version终端会打印版本信息,说明安装成功。
    image

遇到问题

  1. 在执行./autogen.sh命令时遇到报错:
aclocal: command not found error while running aclocal.
  • 说明丢失的aclocal,而aclocal是automake包一部分,automake包依赖aclocal,因此需要安装automake。如果linux的yum源正常的话可以使用命令:
sudo apt-get install automake
  • 如果yum源没法用或者没联网的话,可以采用离线挂载的方式进行安装,首先把redhat系统的iso文件,放到 / 目录下,然后执行如下命令:
mount –o loop /RHEL_6.4\ X86_64.iso
yum –y install automake

注意如果虚拟机内存过小的话,安装会失败。
2. 执行./autogen.sh命令时提示系统中已有的automake版本较低,需要更新automake版本。
我把automake.1.11版本上传到了个人工作区间,然后根据下面这片博客进行安装即可。
https://blog.csdn.net/qq_30549833/article/details/72955881
这个网址是Valgrind的使用说明文档:
http://www.valgrind.org/docs/manual/ms-manual.html
这篇博客也有介绍:
https://www.cnblogs.com/skyfsm/p/8823170.html
3. 执行过程中,终端会出现很多 make[1]: Leaving directory '/usr/local/xxxxx' 提示,不用管,继续make install。

make[1]: Leaving directory `/usr/local/nginx-1.12.1;

然后:

  • 我只需要去看/usr/local下面是否有valgrind文件夹?
  • 如果已经有valgrind文件夹?我们再去看valgrind是否可以正常使用?
  • 如果执行valgrind --version ,或者./valgrind都有提示,则说明安装成功。

个人总结

《./configure –prefix 命令用法》

在Linux上编译安装软件时,经常遇到./configure –prefix=usr 这个命令。./configure –prefix是什么意思呢?下面简单介绍一下./configure –prefix 的用法。
源码的安装一般由有这三个步骤:配置(configure)、编译(make)、安装(make install)。

  • Configure是一个可执行脚本,它有很多选项,在待安装的源码路径下使用命令./configure –help输出详细的选项列表。其中–prefix选项就是配置安装的路径。
  • 如果不配置该选项,安装后可执行文件默认放在/usr /local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc,其它的资源文件放在/usr /local/share,比较分散。
  • 为了便于集中管理某个软件的各种文件,可以配置–prefix,如:
./configure –prefix=/usr/local

可以把所有资源文件放在/usr/local的路径中,就不会分散了。

  • 用--prefix选项的另一个好处是卸载软件或移植软件。当某个安装的软件不再需要时,只须简单地删除该安装目录,就可以把软件卸载得干干净净;移植软件只需拷贝整个目录到另外一个机器即可(相同的操作系统)。
  • 当要卸载程序,也可以在原来的make目录下用一次make uninstall,但前提是make文件指定过uninstall。

标签:--,local,make,valgrind,内存,检测工具,安装,usr
From: https://www.cnblogs.com/jj-Must-be-sucessful/p/17005792.html

相关文章

  • 【C语言】静态内存开辟₀、动态内存开辟¹、栈、堆。
    ......
  • 字节内存对齐问题
    编译指示强制一字节对齐:#pragmapack(push,1)structs{inta;char;};#pragmapack(pop)一些结构体转字符数组和字符数组转结构体操作:好像......
  • strcore.cpp内存泄露
    detectmemoryleak!f:/rtm/vctools/vc7libs/ship/atlmfc/src/mfc/strcore.cpp(141)  ......查看output窗口,程序中不知何时出现了内存泄露的问题。经过一阵排查,发现是......
  • dd 命令检查服务器磁盘性能以及内存健康检查
    查看磁盘IOsudotimeout60ddif=/dev/zeroof=/root/a.datbs=8kcount=20Koflag=direct查看内存是否损坏grep"[0-9]"/sys/devices/system/edac/mc/mc*/csro......
  • C#-exe间通讯(二)-共享内存
    一、共享内存的帮助类/***┌──────────────────────────────────────────────────────────────┐*│......
  • AIR32F103(七) AIR32F103CBT6/CCT6启用96K内存
    目录AIR32F103(一)合宙AIR32F103CBT6开发板上手报告AIR32F103(二)Linux环境和LibOpenCM3项目模板AIR32F103(三)Linux环境基于标准外设库的项目模板AIR32F103(四)2......
  • 共享内存
             ......
  • 动态内存
    malloc/freevoid*malloc(size_tnum)voidfree(void*p)malloc函数只关心申请的内存的大小。malloc申请到的是一块连续的内存,有时可能会比所申请的空间大。其有时会......
  • 堆内存的分配与释放
    当程序运行到需要一个动态分配的变量或对象时,必须向系统申请取得堆中的一块所需大小的存贮空间,用于存贮该变量或对象。当不再使用该变量或对象时,也就是它的生命结束时,要显......
  • 如何确保不使用动态内存
      在许多嵌入式应用程序中,内存分配必须是静态的,而不是动态的。意味着在应用程序中不应使用对malloc()或free()等内容的调用,因为它们可能会在运行时失败(内存不足、堆碎片)。......