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

嵌入式大杂烩 2023-10-18 20:26

星标公众号」,一起进步!

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"

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

以上就是本次的分享。

往期推荐

《嵌入式Linux驱动大全》

谈谈嵌入式软件的兼容性!


在公众号聊天界面回复1024,可获取嵌入式资源

嵌入式大杂烩 专注于嵌入式技术,包括但不限于C/C++、嵌入式、物联网、Linux等编程学习笔记,同时,内包含大量的学习资源。欢迎关注,一同交流学习,共同进步!
评论
  • ARMv8-A是ARM公司为满足新需求而重新设计的一个架构,是近20年来ARM架构变动最大的一次。以下是对ARMv8-A的详细介绍: 1. 背景介绍    ARM公司最初并未涉足PC市场,其产品主要针对功耗敏感的移动设备。     随着技术的发展和市场需求的变化,ARM开始扩展到企业设备、服务器等领域,这要求其架构能够支持更大的内存和更复杂的计算任务。 2. 架构特点    ARMv8-A引入了Execution State(执行状
    丙丁先生 2025-01-12 10:30 486浏览
  • 新年伊始,又到了对去年做总结,对今年做展望的时刻 不知道你在2024年初立的Flag都实现了吗? 2025年对自己又有什么新的期待呢? 2024年注定是不平凡的一年, 一年里我测评了50余块开发板, 写出了很多科普文章, 从一个小小的工作室成长为科工公司。 展望2025年, 中国香河英茂科工, 会继续深耕于,具身机器人、飞行器、物联网等方面的研发, 我觉得,要向未来学习未来, 未来是什么? 是掌握在孩子们生活中的发现,和精历, 把最好的技术带给孩子,
    丙丁先生 2025-01-11 11:35 466浏览
  • 根据Global Info Research(环洋市场咨询)项目团队最新调研,预计2030年全球无人机电池和电源产值达到2834百万美元,2024-2030年期间年复合增长率CAGR为10.1%。 无人机电池是为无人机提供动力并使其飞行的关键。无人机使用的电池类型因无人机的大小和型号而异。一些常见的无人机电池类型包括锂聚合物(LiPo)电池、锂离子电池和镍氢(NiMH)电池。锂聚合物电池是最常用的无人机电池类型,因为其能量密度高、设计轻巧。这些电池以输出功率大、飞行时间长而著称。不过,它们需要
    GIRtina 2025-01-13 10:49 211浏览
  • 随着数字化的不断推进,LED显示屏行业对4K、8K等超高清画质的需求日益提升。与此同时,Mini及Micro LED技术的日益成熟,推动了间距小于1.2 Pitch的Mini、Micro LED显示屏的快速发展。这类显示屏不仅画质卓越,而且尺寸适中,通常在110至1000英寸之间,非常适合应用于电影院、监控中心、大型会议、以及电影拍摄等多种室内场景。鉴于室内LED显示屏与用户距离较近,因此对于噪音控制、体积小型化、冗余备份能力及电气安全性的要求尤为严格。为满足这一市场需求,开关电源技术推出了专为
    晶台光耦 2025-01-13 10:42 525浏览
  •   在信号处理过程中,由于信号的时域截断会导致频谱扩展泄露现象。那么导致频谱泄露发生的根本原因是什么?又该采取什么样的改善方法。本文以ADC性能指标的测试场景为例,探讨了对ADC的输出结果进行非周期截断所带来的影响及问题总结。 两个点   为了更好的分析或处理信号,实际应用时需要从频域而非时域的角度观察原信号。但物理意义上只能直接获取信号的时域信息,为了得到信号的频域信息需要利用傅里叶变换这个工具计算出原信号的频谱函数。但对于计算机来说实现这种计算需要面对两个问题: 1.
    TIAN301 2025-01-14 14:15 123浏览
  • 01. 什么是过程能力分析?过程能力研究利用生产过程中初始一批产品的数据,预测制造过程是否能够稳定地生产符合规格的产品。可以把它想象成一种预测。通过历史数据的分析,推断未来是否可以依赖该工艺持续生产高质量产品。客户可能会要求将过程能力研究作为生产件批准程序 (PPAP) 的一部分。这是为了确保制造过程能够持续稳定地生产合格的产品。02. 基本概念在定义制造过程时,目标是确保生产的零件符合上下规格限 (USL 和 LSL)。过程能力衡量制造过程能多大程度上稳定地生产符合规格的产品。核心概念很简单:
    优思学院 2025-01-12 15:43 557浏览
  • 食物浪费已成为全球亟待解决的严峻挑战,并对环境和经济造成了重大影响。最新统计数据显示,全球高达三分之一的粮食在生产过程中损失或被无谓浪费,这不仅导致了资源消耗,还加剧了温室气体排放,并带来了巨大经济损失。全球领先的光学解决方案供应商艾迈斯欧司朗(SIX:AMS)近日宣布,艾迈斯欧司朗基于AS7341多光谱传感器开发的创新应用来解决食物浪费这一全球性难题。其多光谱传感解决方案为农业与食品行业带来深远变革,该技术通过精确判定最佳收获时机,提升质量控制水平,并在整个供应链中有效减少浪费。 在2024
    艾迈斯欧司朗 2025-01-14 18:45 82浏览
  • 随着通信技术的迅速发展,现代通信设备需要更高效、可靠且紧凑的解决方案来应对日益复杂的系统。中国自主研发和制造的国产接口芯片,正逐渐成为通信设备(从5G基站到工业通信模块)中的重要基石。这些芯片凭借卓越性能、成本效益及灵活性,满足了现代通信基础设施的多样化需求。 1. 接口芯片在通信设备中的关键作用接口芯片作为数据交互的桥梁,是通信设备中不可或缺的核心组件。它们在设备内的各种子系统之间实现无缝数据传输,支持高速数据交换、协议转换和信号调节等功能。无论是5G基站中的数据处理,还是物联网网关
    克里雅半导体科技 2025-01-10 16:20 451浏览
  • 数字隔离芯片是现代电气工程师在进行电路设计时所必须考虑的一种电子元件,主要用于保护低压控制电路中敏感电子设备的稳定运行与操作人员的人身安全。其不仅能隔离两个或多个高低压回路之间的电气联系,还能防止漏电流、共模噪声与浪涌等干扰信号的传播,有效增强电路间信号传输的抗干扰能力,同时提升电子系统的电磁兼容性与通信稳定性。容耦隔离芯片的典型应用原理图值得一提的是,在电子电路中引入隔离措施会带来传输延迟、功耗增加、成本增加与尺寸增加等问题,而数字隔离芯片的目标就是尽可能消除这些不利影响,同时满足安全法规的要
    华普微HOPERF 2025-01-15 09:48 107浏览
  • 流量传感器是实现对燃气、废气、生活用水、污水、冷却液、石油等各种流体流量精准计量的关键手段。但随着工业自动化、数字化、智能化与低碳化进程的不断加速,采用传统机械式检测方式的流量传感器已不能满足当代流体计量行业对于测量精度、测量范围、使用寿命与维护成本等方面的精细需求。流量传感器的应用场景(部分)超声波流量传感器,是一种利用超声波技术测量流体流量的新型传感器,其主要通过发射超声波信号并接收反射回来的信号,根据超声波在流体中传播的时间、幅度或相位变化等参数,间接计算流体的流量,具有非侵入式测量、高精
    华普微HOPERF 2025-01-13 14:18 514浏览
  • 随着全球向绿色能源转型的加速,对高效、可靠和环保元件的需求从未如此强烈。在这种背景下,国产固态继电器(SSR)在实现太阳能逆变器、风力涡轮机和储能系统等关键技术方面发挥着关键作用。本文探讨了绿色能源系统背景下中国固态继电器行业的前景,并强调了2025年的前景。 1.对绿色能源解决方案日益增长的需求绿色能源系统依靠先进的电源管理技术来最大限度地提高效率并最大限度地减少损失。固态继电器以其耐用性、快速开关速度和抗机械磨损而闻名,正日益成为传统机电继电器的首选。可再生能源(尤其是太阳能和风能
    克里雅半导体科技 2025-01-10 16:18 333浏览
  • PNT、GNSS、GPS均是卫星定位和导航相关领域中的常见缩写词,他们经常会被用到,且在很多情况下会被等同使用或替换使用。我们会把定位导航功能测试叫做PNT性能测试,也会叫做GNSS性能测试。我们会把定位导航终端叫做GNSS模块,也会叫做GPS模块。但是实际上他们之间是有一些重要的区别。伴随着技术发展与越发深入,我们有必要对这三个词汇做以清晰的区分。一、什么是GPS?GPS是Global Positioning System(全球定位系统)的缩写,它是美国建立的全球卫星定位导航系统,是GNSS概
    德思特测试测量 2025-01-13 15:42 527浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦