范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

工具Valgrind仿真调试工具的使用

  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.bz2Valgrind使用
  准备一个有内存泄漏、内存越界问题的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-
  猜你喜欢:
  分享几款优秀的绘图工具
  实用 | 分享几个非常实用的开源项目
  C语言、嵌入式重点知识:回调函数
  嵌入式必备之Git的使用
  1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。私信回复1024,即可免费获取!

中望软件携手中国长城,打造全国产CAD软件整机解决方案中望软件携手中国长城,打造全国产CAD软件整机解决方案广州中望龙腾软件股份有限公司(以下简称中望软件)携手中国长城科技集团股份有限公司(以下简称中国长城),共同完成中望CADLin增容量,延寿命!深职院师生团队破解锂离子电池技术难题读创深圳商报首席记者吴吉通讯员罗大为近日,第七届中国互联网大学生创新创业大赛广东省分赛现场传来喜讯,深圳职业技术学院(以下简称深职院)材料与环境工程学院师生团队锂电池负极材料升级项日均花销19元,适合做网约车吗?比亚迪e3用车调查随着新能源汽车时代的加速到来,各行各业都发生了不少改变,其中与我们出行相关的家用车网约车市场变化最大,许多家庭或者司机都开始考虑新能源汽车。比亚迪作为国内新能源汽车的领头羊,在纯电8点1氪天猫超市就矿泉水出现老鼠事件道歉字节计划下半年推出音乐App飞乐华为Mate50Pro或10月发布上市进行时Rivian据知情人士称,亚马逊支持的电动汽车初创公司Rivian正准备在第四季度上市,并希望通过此次IPO融资至多80亿美元。Rivian上月秘密提交了IPO申请。如果高通供货华为,暴露出老美的私心,三星台积电被套路了?美方的私心暴露在美国的持续打压之下,华为一度无法正常的获取到所需的芯片,只能是依靠库存芯片度日。这使得很多华为的产品都无法顺利的生产出来,这点相信大家还是比较有感觉的,因为之前华为华为员工再等等,会重新推出5G手机华为以后只能发4G手机吗?不会的。在今年7月29日,华为在迟到了将近4个月后,终于发布了华为P50系列,在双手被束缚的前提下,为消费者呈现了一台非常优秀的影像旗舰。但是该系列手机最苹果手机为什么这么多人支持,华为不香吗?感谢您的阅读!苹果手机为什么这么多人支持?华为不香了吗?我不知道为什么大家会有这种想法,苹果手机确实有不少的用户群体,但是并不是说有很多人去支持,苹果有自己的特点,也有自己的优势,任正非罕见发声,华为芯片再突破,美国芯片封锁计划即将破灭好久不见的华为创始人任正非,再次上了热搜,这一次任老依旧带着发人深思的话语出现。9月14日深夜,就在苹果推出iPhone13的前夜,任正非在华为中央研究院开启了创新先锋座谈,与芯片苹果还能嚣张多久?华为即将解决5G问题,Mate50系列或携5G回归面对一轮轮的制裁,华为今年还是靠着自己的底蕴,打造出了P50系列。这也是当前国产化最高的一款华为手机,P50系列的整体配置很不错,但是有一个致命伤,那就是不支持5G。接下来华为还会华为HDC开发者大会带你领略华为黑科技,来就对了一年一度的华为开发者大会(HDC)定档2021年10月22日至24日,为期3天,地点依然选在素有华为欧洲小镇之称的东莞松山湖。9月16日开售的HDC早鸟票一经上架,就被一众热情地粉iOS15正式版将于9月21日推送,一篇文章告诉你哪些机型不适合升级最新消息,iOS15iPadOS15watchOS8和tvOS15等操作系统将于9月21日凌晨正式发布。相信很多小伙伴都在疑惑自己的手机究竟适不适合升级到iOS15正式版,小编作为
三星很冲动,12256G再降2200元,1。08亿像素50倍变焦,香其实熟悉三星机型的朋友都知道,2021年的三星GalaxyNote20系列取消了,毕竟是三星堆料最充足的旗舰,每一代的Note更是有机皇之称,都是顶级旗舰,而且拥有庞大的用户群体,Meta专利提出为ARVR腕带设备安装可拆卸旋转的传感摄像头(映维网Nweon2022年01月18日)当诸如智能手表之类的腕带设备包含摄像头时,摄像头通常具有固定方向和固定焦距参数,从而限制了摄像头的使用方式。人造现实通常可以提供丰富的沉浸什么是蓝牙劫持?如何避免劫持攻击蓝牙是一种将手机和其他设备连接在一起的无线连接。尽管它现在不像其创建者预期的那样流行在许多用例中已被Wifi取代但大多数设备仍然具有蓝牙功能。劫持攻击是如何发生的?黑客只需几个简单2022年,机身尺寸才是小屏硬性标准,屏幕大小不是1,随着安卓全面屏的发展,边框越来越小的情况,小屏这个定义其实已经被拉宽了。我在很多地方,包括贴吧,B站,知乎,看过很多这样的言论,你小米12X,6。28英寸装什么小屏手机,5。8宁德时代进军换电市场机构建议关注相关个股日前,宁德时代官方消息,宁德时代将于1月18日举办发布会,推出换电品牌EVOGO。据业内人士透露,宁德时代换电将面向全部车企。有分析指出,宁德时代此举意味着其正式进军车电分离的换电三星扩展其智能显示器阵容,其中包括43英寸型号三星智能显示器是一款相当新的设备,我们非常喜欢这个想法,它对于大学生或小公寓居民等用户来说非常方便。以下是几个月前我们对27英寸三星智能显示器M7的评价预计阅读时间3分钟三星智能显iPhone13价格松动,128GB起步价跌至新低,还等什么iPhone14?还记得前几个月的时候,iPhone13刚刚推出,有不少人对于iPhone13有一些失望,而这些失望其实都主要集中在对于外观的失望。一方面确实整体设计还是延续了iPhone12上那套宁德时代发布换电品牌EVOGO换电发布会亮点1月18日(今日)盘后,宁德正式发布了换电服务品牌EVOGO和换电解决方案。该换电品牌定名EVOGO,而宁德时代也提出,此次换电方案面向的是全体车企,因此,换电方案可微信单删和互删有什么区别?关于微信的删与被删关于微信之心得1。你将A好友设置为加入朋友圈黑名单你发送至朋友圈的文字或照片都将不再被A好友看到,即使A好友点击你的头像,以前的照片也都不再显示。2。你将A好友删你家有闲置的机顶盒吗?有啊,感觉没有用,现在的电视不用机顶盒,只要有无线网络,就可以上网看电视,不过看各电视频道需要付费的。随着不断升级换代,有好几个!家里有斐讯T1机顶盒,从来没用过,说起来都是泪!那普通人能中彩票吗?能中,我现在就摸索出一套双色球选蓝球的技巧,在此分享给大家一起研究研究!一选定一个10期之内没有开过的蓝球每次打10注,红球可以自己随便选,连续买5期10期。有条件也可以多买点,买