当前位置:首页 > 公众号精选 > 嵌入式大杂烩
[导读]关注「Linux大陆」,选择「星标公众号」一起进步!Valgrind简介Valgrind是一套Linux下,开放源代码(GPLV2)的仿真调试工具的集合。Valgrind工具包包含多个工具,如Memcheck、Cachegrind、Helgrind、Callgrind、Massi...

关注「Linux大陆」,选择「星标公众号」一起进步!

Valgrind简介

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

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

Memcheck工具

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

  • 使用未初始化内存;
  • 使用释放后的内存;
  • 使用超出malloc分配的内存块;
  • 对堆栈的非法访问;
  • 内存泄漏;
  • 不正确的malloc/free或new/delete匹配;
  • memcpy()相关函数中的dst和src指针重叠。

Cachegrind工具

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

Helgrind工具

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

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

Callgrind工具

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

Massif工具

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

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

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

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

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

Valgrind安装

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

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

sudo apt install valgrind

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

源码地址:

http://valgrind.org/

下载源码的命令:

wget http://valgrind.org/downloads/valgrind-3.14.0.tar.bz2

Valgrind使用

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

「valgrind_test.c:」

#include 

void f(void)
{
 int* x = malloc(10 * sizeof(int));
 x[10] = 0;       // problem 1: heap block overrun
}                 // problem 2: memory leak -- x not freed

int main(void)
{
 f();
 return 0;
}
这份代码存在两个问题:

  • 使用超出malloc分配的内存。
  • 内存泄漏。
下面一起来使用valgrind的Memcheck工具来检测这份程序。

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

gcc -g valgrind_test.c -o valgrind_test
使用valgrind检测valgrind_test程序:

valgrind --leak-check=yes ./valgrind_test
我们可以用--tool参数指明使用的工具,如:

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

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

==7407== Memcheck, a memory error detector
==7407== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==7407== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==7407== Command: ./valgrind_test
==7407== 
==7407== Invalid write of size 4
==7407==    at 0x108668: f (valgrind_test.c:6)
==7407==    by 0x108679: main (valgrind_test.c:11)
==7407==  Address 0x522d068 is 0 bytes after a block of size 40 alloc'
d
==7407==    at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==7407==    by 0x10865B: f (valgrind_test.c:5)
==7407==    by 0x108679: main (valgrind_test.c:11)
==7407== 
==7407== 
==7407== HEAP SUMMARY:
==7407==     in use at exit: 40 bytes in 1 blocks
==7407==   total heap usage: 1 allocs, 0 frees, 40 bytes allocated
==7407== 
==7407== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
==7407==    at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==7407==    by 0x10865B: f (valgrind_test.c:5)
==7407==    by 0x108679: main (valgrind_test.c:11)
==7407== 
==7407== LEAK SUMMARY:
==7407==    definitely lost: 40 bytes in 1 blocks
==7407==    indirectly lost: 0 bytes in 0 blocks
==7407==      possibly lost: 0 bytes in 0 blocks
==7407==    still reachable: 0 bytes in 0 blocks
==7407==         suppressed: 0 bytes in 0 blocks
==7407== 
==7407== For counts of detected and suppressed errors, rerun with: -v
==7407== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
输出结果包含有很多信息,我们可以很容易查看到了关键的信息:

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

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

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

  • definitely lost(明确的泄漏)
  • possibly lost(可能的泄漏)
其中,明确的泄漏必须要进行修复。

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

Valgrind交叉编译

1、下载valgrind源码包:

wget http://valgrind.org/downloads/valgrind-3.14.0.tar.bz2
2、修改valgrind里的configure文件:

把 armv7 * ) 改成 armv7 * |arm)。

3、生成Makefile

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

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

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

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

  • --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文件:

编译、安装:

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

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

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

tmp/bin/valgrind --tool=memcheck --leak-check=yes ./valgrind_test
其中,tmp文件夹与与valgrind_test在同一路径。这时候可能会报如下错误:

“valgrind: failed to start tool ‘memcheck’ for platform ‘arm-linux’: No such file or directory”
这是因为valgrind需要依赖其动态库,而没有找到动态库。因为是临时测试,在valgrind_test路径输入如下命令进行设置:

export VALGRIND_LIB="tmp/lib/valgrind"
这只是在当前开发板终端生效,下次重新进入开发板终端需要重新设置。

以上就是本次的分享。码字不易,期待你的三连~

大家平时都用些什么工具呢?

欢迎留言分享~

参考资料

1、https://www.valgrind.org/docs/manual/quick-start.html#quick-start.prepare

2、https://blog.csdn.net/andylauren/article/details/93189740

3、https://zhuanlan.zhihu.com/p/75416381

4、https://blog.csdn.net/listener51/article/details/86716497?depth_1-

历史文章:

一文读懂apt、deb与背后的知识

2021-06-12

实用 | 远程gdb调试

2021-06-20

有趣 | 最近遇到一个狡猾的bug,复盘分享

2021-06-20



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭