0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式相关的动态检测工具Valgrind简介

dyquk4xk2p3d 来源:良许Linux 2023-11-08 09:41 次阅读

Valgrind简介

Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。

b461d97c-7dc6-11ee-939d-92fbcf53809c.png

Valgrind工具包包含多个工具,如Memcheck、Cachegrind、Helgrind、Callgrind、Massif。

Memcheck工具

Memcheck工具是Valgrind中最常用的工具,用来检测程序中出现的内存问题。它能检测如下问题:

使用未初始化内存;

使用释放后的内存;

使用超出malloc分配的内存块;

对堆栈的非法访问;

内存泄漏;

不正确的malloc/free或new/delete匹配;

memcpy()相关函数中的dst和src指针重叠。

Cachegrind工具

Callgrind收集程序运行时的一些数据,函数调用关系等信息,还可以有选择地进行cacheinterwetten与威廉的赔率体系 。在运行结束时,它会把分析数据写入一个文件。callgrind_annotate可以把这个文件的内容转化成可读的形式。

Helgrind工具

它主要用来检查多线程程序中出现的竞争问题。Helgrind寻找内存中被多个线程访问,而又没有一贯加锁的区域,这些区域往往是线程之间失去同步的地方,而且会导致难以发掘的错误。

Helgrind实现了名为” Eraser” 的竞争检测算法,并做了进一步改进,减少了报告错误的次数。

Callgrind工具

它模拟 CPU中的一级缓存I1,D1和L2二级缓存,能够精确地指出程序中 cache的丢失和命中。如果需要,它还能够为我们提供cache丢失次数,内存引用次数,以及每行代码,每个函数,每个模块,整个程序产生的指令数。这对优化程序有很大的帮助。

Massif工具

堆栈分析器,它能测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈的大小。

Massif能帮助我们减少内存的使用,在带有虚拟内存的现代系统中,它还能够加速我们程序的运行,减少程序停留在交换区中的几率。

Valgrind由内核(core)以及基于内核的其他调试工具组成。其基于仿真方式对程序进行调试,它先于应用程序获取实际处理器的控制权,并在实际处理器的基础上仿真一个虚拟处理器,并使应用程序运行于这个虚拟处理器之上,从而对应用程序的运行进行监视。

b47cd34e-7dc6-11ee-939d-92fbcf53809c.png

应用程序并不知道该处理器是虚拟的还是实际的,已经编译成二进制代码的应用程序并不用重新进行编译,Valgrind 直接解释二进制代码使得应用程序基于它运行,从而能够检查内存操作时可能出现的错误。

所以在Valgrind下运行的程序运行速度要慢得多,而且使用的内存要多得多。因此,最好在性能好的机器上使用Valgrind,并且是在开发调试阶段使用。

Valgrind安装

Valgrind的安装方式很简单。我们首先查看一下我们的系统中有没有Valgrind:

b495f824-7dc6-11ee-939d-92fbcf53809c.png

显然,我们这里的系统中没有Valgrind,按提示输入如下命令安装即可:

sudoaptinstallvalgrind

b4adf8a2-7dc6-11ee-939d-92fbcf53809c.png

另外,也可以通过下载源码编译、安装。

源码地址:

http://valgrind.org/

下载源码的命令:

wgethttp://valgrind.org/downloads/valgrind-3.14.0.tar.bz2

Valgrind使用

准备一个有内存泄漏、内存越界问题的demo进行测试。为了方便,我们使用官方提供的一个经典的测试demo:

「valgrind_test.c:」

#include

voidf(void)
{
int*x=malloc(10*sizeof(int));
x[10]=0;//problem1:heapblockoverrun
}//problem2:memoryleak--xnotfreed

intmain(void)
{
f();
return0;
}

这份代码存在两个问题:

使用超出malloc分配的内存。

内存泄漏。

下面一起来使用valgrind的Memcheck工具来检测这份程序。

首先,我们使用-g编译程序以包含调试信息,以便Memcheck的错误消息包含确切的行号。

gcc-gvalgrind_test.c-ovalgrind_test

使用valgrind检测valgrind_test程序:

valgrind--leak-check=yes./valgrind_test

我们可以用--tool参数指明使用的工具,如:

--tool=memcheck

如果不明确设置--tool参数,则valgrind的检测工具默认使用的是Memcheck工具。--leak-check=yes选项打开详细的内存泄漏检测器。

我们执行检测工具之后的结果如:

b4c080bc-7dc6-11ee-939d-92fbcf53809c.png

==7407==Memcheck,amemoryerrordetector
==7407==Copyright(C)2002-2017,andGNUGPL'd,byJulianSewardetal.
==7407==UsingValgrind-3.13.0andLibVEX;rerunwith-hforcopyrightinfo
==7407==Command:./valgrind_test
==7407==
==7407==Invalidwriteofsize4
==7407==at0x108668:f(valgrind_test.c:6)
==7407==by0x108679:main(valgrind_test.c:11)
==7407==Address0x522d068is0bytesafterablockofsize40alloc'd
==7407==at0x4C2FB0F:malloc(in/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==7407==by0x10865B:f(valgrind_test.c:5)
==7407==by0x108679:main(valgrind_test.c:11)
==7407==
==7407==
==7407==HEAPSUMMARY:
==7407==inuseatexit:40bytesin1blocks
==7407==totalheapusage:1allocs,0frees,40bytesallocated
==7407==
==7407==40bytesin1blocksaredefinitelylostinlossrecord1of1
==7407==at0x4C2FB0F:malloc(in/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==7407==by0x10865B:f(valgrind_test.c:5)
==7407==by0x108679:main(valgrind_test.c:11)
==7407==
==7407==LEAKSUMMARY:
==7407==definitelylost:40bytesin1blocks
==7407==indirectlylost:0bytesin0blocks
==7407==possiblylost:0bytesin0blocks
==7407==stillreachable:0bytesin0blocks
==7407==suppressed:0bytesin0blocks
==7407==
==7407==Forcountsofdetectedandsuppressederrors,rerunwith:-v
==7407==ERRORSUMMARY:2errorsfrom2contexts(suppressed:0from0)

输出结果包含有很多信息,我们可以很容易查看到了关键的信息:

b4cf0a1a-7dc6-11ee-939d-92fbcf53809c.png

b4e65210-7dc6-11ee-939d-92fbcf53809c.png

其中,输出信息告诉我们无效地写入了4个字节,并且提示了可能出现问题的代码行数。堆栈跟踪告诉我们调用了一次malloc申请内存,但并没有free,并且指出了在哪里分配了内存。

另外,这里的7407表示的是进程ID号。

内存泄漏有几种类型,最重要的两类是:

definitely lost(明确的泄漏)

possibly lost(可能的泄漏)

其中,明确的泄漏必须要进行修复。

以上就是关于valgrind最常用的Memcheck工具的简单使用介绍,使用Memcheck工具有时候我们可以很清楚地检测出程序存在的一些隐患。其它工具今后有用到的话再做分享,大家感兴趣的话可以自行去研究学习。

Valgrind交叉编译

1、下载valgrind源码包:

wgethttp://valgrind.org/downloads/valgrind-3.14.0.tar.bz2

2、修改valgrind里的configure文件:

armv7 * ) 改成 armv7 * |arm)。

b4fdc4d6-7dc6-11ee-939d-92fbcf53809c.png

3、生成Makefile

./configure--host=arm-linux-gnueabihfCC=/home/LinuxZn/ToolChain/gcc-arm-linux-gnueabihf-6.2.1/bin/arm-linux-gnueabihf-gccCXX=/home/LinuxZn/ToolChain/gcc-arm-linux-gnueabihf-6.2.1/bin/arm-linux-gnueabihf-g++--prefix=$PWD/tmp

b514b3b2-7dc6-11ee-939d-92fbcf53809c.png

这个命令似乎很长,但并不难,只是加了几个配置参数。这些配置参数怎么看?

我们可以输入./configure --help命令来查看支持的配置:

b5300b9e-7dc6-11ee-939d-92fbcf53809c.png

下面我们依次来分析上面那个很长的命令:

--host=arm-linux-gnueabihf:表明了我们最终可执行文件运行的环境。

CC=/home/LinuxZn/ToolChain/gcc-arm-linux-gnueabihf-6.2.1/bin/arm-linux-gnueabihf-gcc:这是指定我们的交叉编译工具arm-linux-gnueabihf-gcc,这里直接给出绝对路径。

CXX=/home/LinuxZn/ToolChain/gcc-arm-linux-gnueabihf-6.2.1/bin/arm-linux-gnueabihf-g++:这是指定我们的交叉编译工具arm-linux-gnueabihf-g++,这里直接给出绝对路径。

--prefix=$PWD/tmp:指定安装的路径。表明安装路径在当前路径下的tmp文件夹中。

这时候已经生成了Makefile文件:

b548af50-7dc6-11ee-939d-92fbcf53809c.png

编译、安装:

make
makeinstall

安装完成后tmp文件夹下的内容为:

b5566e1a-7dc6-11ee-939d-92fbcf53809c.png

这时候我们就可以把tmp整个文件夹拷到板子上使用了。tmp的大小为一百多兆,注意查看板子存储空间够不够:

b57fe90c-7dc6-11ee-939d-92fbcf53809c.png

我们可以配置板子上的valgrind环境。如果仅是临时使用,可以这么用:

tmp/bin/valgrind--tool=memcheck--leak-check=yes./valgrind_test

其中,tmp文件夹与与valgrind_test在同一路径。这时候可能会报如下错误:

“valgrind:failedtostarttool‘memcheck’forplatform‘arm-linux’:Nosuchfileordirectory”

这是因为valgrind需要依赖其动态库,而没有找到动态库。因为是临时测试,在valgrind_test路径输入如下命令进行设置:

exportVALGRIND_LIB="tmp/lib/valgrind"

这只是在当前开发板终端生效,下次重新进入开发板终端需要重新设置。

以上就是本次的分享。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5082

    文章

    19111

    浏览量

    304841
  • Linux
    +关注

    关注

    87

    文章

    11296

    浏览量

    209348
  • 源代码
    +关注

    关注

    96

    文章

    2945

    浏览量

    66731
  • Valgrind
    +关注

    关注

    0

    文章

    9

    浏览量

    6807
  • 动态检测
    +关注

    关注

    0

    文章

    2

    浏览量

    608

原文标题:嵌入式相关的动态检测工具

文章出处:【微信号:良许Linux,微信公众号:良许Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    好用的u盘芯片检测工具

    好用的u盘芯片检测工具
    发表于 04-06 18:53

    促进ARM嵌入式发展的工具简介

    促进ARM嵌入式发展的工具简介
    发表于 07-31 21:55

    一种利用调试软件Valgrind进行嵌入式应用程序错误查找的威廉希尔官方网站

    本文介绍了一种利用调试软件Valgrind进行嵌入式应用程序错误查找的威廉希尔官方网站 ,利用它可以高效、自动地查找出程序中的多种错误。首先介绍了嵌入式程序常见错误,接着研究了Valgrind的工作
    发表于 04-23 06:49

    嵌入式Linux开发简介

    目录1、嵌入式Linux开发简介1.1嵌入式系统1.2嵌入式操作系统简介1.2.1嵌入式操作系统
    发表于 12-14 08:24

    valgrind是怎样去移植源码的

    嵌入式内存检测工具-valgrind移植源码较快)准备:解压tar -jxvf valgrind-3.16.1.tar.bz2进入valgrind
    发表于 12-17 07:56

    硬件检测工具下载

    硬件检测工具下载 EVEREST(原名AIDA32)一个测试软硬件系统信息的权威工具,它可以详细的显示出PC
    发表于 01-10 15:54 49次下载
    硬件<b class='flag-5'>检测工具</b>下载

    基于Valgrind嵌入式应用程序调试威廉希尔官方网站

    本文介绍了一种利用调试软件Valgrind 进行嵌入式应用程序错误查找的威廉希尔官方网站 ,利用它可以高效、自动地查找出程序中的多种错误。首先介绍了嵌入式程序常见错误,接着研究了Valgrin
    发表于 12-18 15:36 17次下载

    GPS系统信息检测工具

    导航GPS检测工具 GPS系统信息检测工具
    发表于 02-22 15:33 2次下载

    嵌入式系统原理简介与入门

    嵌入式系统原理简介与入门
    发表于 10-30 16:02 3次下载
    <b class='flag-5'>嵌入式</b>系统原理<b class='flag-5'>简介</b>与入门

    嵌入式Linux操作系统安装及相关工具使用

    本书全面介绍了嵌入式Linux系统开发过程中,从底层系统支持到上层GUI应用的方方面面,内容涵盖Linux操作系统的安装及相关工具的使用、配置,嵌入式编程所需要的基础知识(交叉编译
    发表于 03-26 14:30 15次下载

    嵌入式Python简介

    嵌入式Python简介
    的头像 发表于 12-28 09:51 2870次阅读

    加密狗检测工具

    威廉希尔官方网站 员专用加密狗型号检测工具
    发表于 03-23 09:13 1次下载

    valgrind检测内存问题的原理

    valgrind 是一个提供了一些 debug 和优化的工具工具箱,可以使得你的程序减少内存泄漏或者错误访问。valgrind 默认使用 memcheck 去检查内存问题。memch
    的头像 发表于 05-23 09:30 2382次阅读
    <b class='flag-5'>valgrind</b><b class='flag-5'>检测</b>内存问题的原理

    加密狗检测工具

    加密狗检测工具免费下载。
    发表于 05-29 09:19 1次下载

    电路板检测工具都有什么

    在电子制造业中,电路板检测工具是至关重要的。它们用于确保电路板的质量和性能,以满足设计要求和行业标准。本文将详细介绍各种电路板检测工具,包括它们的功能、优势和应用场景。 一、电路板检测工具的分类
    的头像 发表于 05-29 14:20 2649次阅读