在ARM Linux 使用 Valgrind

2020-01-13来源: eefocus关键字:ARM  Linux  Valgrind

Linux valgrind 移植到ARM-Linux


 一、Cross-Compile/交叉编译


(1)下载及解压Valgrind-3.11


(2)修改confirure


  将armv7*)修改为armv7*|arm*)


(3)执行configure


./configure CC=arm-linux-gcc CPP=arm-linux-cpp CXX=arm-linux-g++  --host=arm-linux --prefix=/opt/valgrind/lib


注意:CC=arm-linux-gcc,之所以没有像有些博客上写的、用了绝对路径,是因为「我已经将arm-linux-gcc 软链接/soft-linke 到了实际的gcc」。


(4)make


(5)make install


二、移植到ARM开发板


注意:make install之后,编译生成的bin/和lib/目录存放在PC上的/opt/valgrind/lib目录下。将此目录下的bin/和lib/目录单独「复制/Copy」出来,不要Copy share/和include/目录,因为文件有点大,而且include/和share/这两个目录在开发板上没有用。


  在ARM开发板上建立「目录-/opt/valgrind/lib/valgrind/」,将上面刚刚编译得到的lib/目录下的文件(.so, .a 等)放到左边提到的这个目录(/opt/valgrind/lib/valgrind)中。


注意:上面这个步骤非常关键,如果放错位置,在运行程序valgrind的时候,会提示「failed to start 'memcheck' : No such file or directory」。


三、ARM上配置使用


1、Error:在运行「./valgrind ls」的时候依然碰到了一个错误,出现在「vgdb」。错误提示是:


[12:58:19]root@freescale ~/valgrind/valgrind/bin$ ./valgrind ls           

[12:58:19]==5978== Memcheck, a memory error detector

[12:58:19]==5978== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.

[12:58:19]==5978== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info

[12:58:19]==5978== Command: ls

[12:58:19]==5978== 

[12:58:20]==5978== error writing 36 bytes to shared mem /tmp/vgdb-pipe-shared-mem-vgdb-5978-by-root-on-???


在网页failure to run on armv6 following the armv6 legacy patches suggested by bug 276897找到了一个暂时的方法,就是临时禁用「vgdb」。


[12:54:55]root@freescale ~/valgrind/valgrind/bin$ ./valgrind --vgdb=no ls 

[12:54:55]==5976== Memcheck, a memory error detector

[12:54:55]==5976== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.

[12:54:55]==5976== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info

[12:54:55]==5976== Command: ls

[12:54:55]==5976== 

[12:54:56]ERROR: ld.so: object '/opt/valgrind/lib/valgrind/vgpreload_core-arm-linux.so' from LD_PRELOAD cannot be preloaded: ignored.

[12:54:56]ERROR: ld.so: object '/opt/valgrind/lib/valgrind/vgpreload_memcheck-arm-linux.so' from LD_PRELOAD cannot be preloaded: ignored.

[12:54:57]==5976== Conditional jump or move depends on uninitialised value(s)

[12:54:57]==5976==    at 0x4909C98: index (in /lib/libc-2.11.1.so)

[12:54:57]==5976== 

[12:54:58]==5976== Conditional jump or move depends on uninitialised value(s)

[12:54:58]==5976==    at 0x4909D90: strcmp (in /lib/libc-2.11.1.so)

[12:54:58]==5976==    by 0x4910377: strcoll_l (in /lib/libc-2.11.1.so)

[12:54:58]==5976== 

[12:54:58]==5976== Conditional jump or move depends on uninitialised value(s)

[12:54:58]==5976==    at 0x4909D98: strcmp (in /lib/libc-2.11.1.so)

[12:54:58]==5976==    by 0x4910377: strcoll_l (in /lib/libc-2.11.1.so)


 2、LD_PRELOAD错误


 [12:54:56]ERROR: ld.so: object '/opt/valgrind/lib/valgrind/vgpreload_core-arm-linux.so' from LD_PRELOAD cannot be preloaded: ignored. 


上述的错误,经过检查,发现:「/opt/valgrind/lib/valgrind」缺少一些「.so/共享动态库」。重新编译「Valgrind」,并且用「arm-linux-strip」将文件进行精简,顺利复制。程序也顺利运行。


四、Valgrind简介


1、Valgrind是什么?


2、Valgrind能做什么?


(1)「badapp.c」


 1 #include

 2 

 3 void f(void)

 4 {

 5  int* x = malloc(10 * sizeof(int));

 6  x[10] = 0;            // problem 1: heap block overrun

 7 }                         // problem 2: memory leak -- x not freed

 8 

 9 int main(void)

10 {

11  f();

12  return 0;

13 }


(2)


[15:20:06]

[15:20:06]==8399== Memcheck, a memory error detector

[15:20:06]==8399== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.

[15:20:06]==8399== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info

[15:20:06]==8399== Command: ./bad1pp1

[15:20:06]==8399== 

[15:20:07]connect fail. ip:10.167.13.207, strlen(ip):13. File:main.c, Line:696

[15:20:07]Internet Fail. File: main.c, Line: 2469

[15:20:08]==8399== Invalid write of size 4

[15:20:08]==8399==    at 0x8414: f (badapp1.c:6)

[15:20:08]==8399==    by 0x842F: main (badapp1.c:11)

[15:20:08]==8399==  Address 0x496f050 is 0 bytes after a block of size 40 alloc'd

[15:20:08]==8399==    at 0x483481C: malloc (in /opt/valgrind/lib/valgrind/vgpreload_memcheck-arm-linux.so)

[15:20:08]==8399== 

[15:20:08]==8399== 

[15:20:08]==8399== HEAP SUMMARY:

[15:20:08]==8399==     in use at exit: 40 bytes in 1 blocks

[15:20:08]==8399==   total heap usage: 1 allocs, 0 frees, 40 bytes allocated

[15:20:08]==8399== 

[15:20:08]==8399== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1

[15:20:08]==8399==    at 0x483481C: malloc (in /opt/valgrind/lib/valgrind/vgpreload_memcheck-arm-linux.so)

[15:20:08]==8399== 

[15:20:08]==8399== LEAK SUMMARY:

[15:20:08]==8399==    definitely lost: 40 bytes in 1 blocks

[15:20:08]==8399==    indirectly lost: 0 bytes in 0 blocks

[15:20:08]==8399==      possibly lost: 0 bytes in 0 blocks

[15:20:08]==8399==    still reachable: 0 bytes in 0 blocks

[15:20:08]==8399==         suppressed: 0 bytes in 0 blocks

[15:20:08]==8399== 

[15:20:08]==8399== For counts of detected and suppressed errors, rerun with: -v

[15:20:08]==8399== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 11 from 5)


3、Valgrind工作原理?


4、谁开发的Valgrind?


Julian Seward, from Cambridge, UK.


5、Valgrind的名称来源


From Nordic mythology. Originally (before release) the project was named Heimdall, after the watchman of the Nordic gods. He could "see a hundred miles by day or night, hear the grass growing, see the wool growing on a sheep's back" (etc). This would have been a great name, but it was already taken by a security package "Heimdal".


Keeping with the Nordic theme, Valgrind was chosen. Valgrind is the name of the main entrance to Valhalla (the Hall of the Chosen Slain in Asgard). Over this entrance there resides a wolf and over it there is the head of a boar and on it perches a huge eagle, whose eyes can see to the far regions of the nine worlds. Only those judged worthy by the guardians are allowed to pass through Valgrind. All others are refused entrance.


It's not short for "value grinder", although that's not a bad guess.

关键字:ARM  Linux  Valgrind 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic485485.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:ARM系列 STM32F103RCT6 开发
下一篇:ARM S3C2410学习手记

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

ARM嵌入式学习--OK6410裸板程序--1.GPIO控制LED
;  mov pc, lrMakefile: 1 led.bin: start.o 2         arm-linux-ld -Ttext 0x50008000 -o led.elf $^ 3         arm-linux-objcopy -O binary led.elf led.bin 4         arm-linux-objdump -D led.elf > led_elf.dis 5 %.o
发表于 2020-01-09
ARM嵌入式学习--OK6410裸板程序--1.GPIO控制LED
移植mysql到arm平台
最近需要将一个程序移植到arm平台上,程序调用了MySQL数据库,所以就牵扯到将MySQL数据库移植到ARM平台上面,所以在网上大量查阅资料。在baidu文库发现了一篇文档,是wlzxlc上传的文档名称为:《编译ARM平台的QtEmbedded的MySQL插件和移植MySQL》。下面说明里面介绍到:ARM平台下的QtEmbedded所需mysql插件,及MySQL的移植。我的整个移植过程参考了这篇文档,但是遇到了很多的问题,所以又上网搜寻其它资料。现在我已经移植成功,回头看这篇文档,就发现里面有很多疏漏甚至是错误。这些东西如果不详细注明出来,更多的新手绝对还会重蹈我的覆辙,所以在这里将mysql 的arm+linux移植
发表于 2020-01-09
ARM Linux.2.6.34内核移植
ARM-LINUX-GCC版本4.3.2.以安装在/usr/local/arm/4.3.2下.第一步:修改linux-2.6.34/Makefile文件,在makefile中找到以下两条信息并做修改ARCH ? =arm  CROSS_COMPILE ?=/usr/local/arm/4.3.2/bin/arm-linux-第二步:修改平台输入时钟修改平台的时钟频率,修改内核源码“arch/arm/mach-s3c2440/mach-smdk2440.c”把时钟初始化中(S3C24XX_init_clocks(16934400 ))的16934400 改为12000000,因为我们的开发板上为12M第三步:修改
发表于 2020-01-09
编译基于ARM LINUX的驱动模块的Makefile
KERNELDIR = /home/wenhao/platform/linux-2.6.34PWD := $(shell pwd)CROSS_COMPILE = /usr/local/arm/4.3.2/bin/arm-linux-CC    = $(CROSS_COMPILE)gccobj-m := key.o modules:    $(MAKE) -C $(KERNELDIR) M=$(PWD) modulesclean:    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c
发表于 2020-01-09
GNU ARM汇编快速入门
以前用ARM的IDE工具,使用的是ARM标准的汇编语言。现在要使用GNU的工具,当然要了解一点GNU ARM汇编的不同之处。其实非常的简单,浏览一下文档然后再看看程序就完全可以搞定了,或者你硬着头皮看GNU ARM的汇编程序,用不了多少时间你就就可以无师自通了。ARM汇编语言源程序语句 ,一般由指令、伪操作、宏指令和伪指令作成。ARM汇编语言的设计基础是汇编伪指令,汇编伪操作和宏指令。 目前常用的ARM编译环境有2种:ARMASM: ARM公司的IDE中使用了CodeWarrior的编译器,绝大多数windows下的开发者都在使用这一环境,完全按照ARM的规定;GNU ARM ASM:GNU工具的ARM版本
发表于 2020-01-09
交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别
使用EABI作为与兼容的编译器生成的汇编语言的接口。支持EABI的编译器创建的目标文件可以和使用类似编译器产生的代码兼容,这样允许开发者链接一个由不同编译器产生的库。EABI与关于通用计算机的ABI的主要区别是应用程序代码中允许使用特权指令,不需要动态链接(有时是禁止的),和更紧凑的堆栈帧组织用来节省内存。广泛使用EABI的有Power PC和ARM.二. gnueabi相关的两个交叉编译器: gnueabi和gnueabihf在debian源里这两个交叉编译器的定义如下:gcc-arm-linux-gnueabi – The GNU C compiler for armel
发表于 2020-01-08
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved