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」。错误提示是:

[::]root@freescale ~/valgrind/valgrind/bin$ ./valgrind ls
[::]==== Memcheck, a memory error detector
[::]==== Copyright (C) -, and GNU GPL'd, by Julian Seward et al.
[::]==== Using Valgrind-3.11. and LibVEX; rerun with -h for copyright info
[::]==== Command: ls
[::]====
[::]==== error writing bytes to shared mem /tmp/vgdb-pipe-shared-mem-vgdb--by-root-on-???

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

[::]root@freescale ~/valgrind/valgrind/bin$ ./valgrind --vgdb=no ls
[::]==== Memcheck, a memory error detector
[::]==== Copyright (C) -, and GNU GPL'd, by Julian Seward et al.
[::]==== Using Valgrind-3.11. and LibVEX; rerun with -h for copyright info
[::]==== Command: ls
[::]====
[::]ERROR: ld.so: object '/opt/valgrind/lib/valgrind/vgpreload_core-arm-linux.so' from LD_PRELOAD cannot be preloaded: ignored.
[::]ERROR: ld.so: object '/opt/valgrind/lib/valgrind/vgpreload_memcheck-arm-linux.so' from LD_PRELOAD cannot be preloaded: ignored.
[::]==== Conditional jump or move depends on uninitialised value(s)
[::]==== at 0x4909C98: index (in /lib/libc-2.11..so)
[::]====
[::]==== Conditional jump or move depends on uninitialised value(s)
[::]==== at 0x4909D90: strcmp (in /lib/libc-2.11..so)
[::]==== by 0x4910377: strcoll_l (in /lib/libc-2.11..so)
[::]====
[::]==== Conditional jump or move depends on uninitialised value(s)
[::]==== at 0x4909D98: strcmp (in /lib/libc-2.11..so)
[::]==== by 0x4910377: strcoll_l (in /lib/libc-2.11..so)

2、LD_PRELOAD错误

[::]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」

 #include <stdlib.h>

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

(2)

[::]<valgrind/bin/valgrind --vgdb=no --leak-check=full ./bad1pp1
[::]==== Memcheck, a memory error detector
[::]==== Copyright (C) -, and GNU GPL'd, by Julian Seward et al.
[::]==== Using Valgrind-3.11. and LibVEX; rerun with -h for copyright info
[::]==== Command: ./bad1pp1
[::]====
[::]connect fail. ip:10.167.13.207, strlen(ip):. File:main.c, Line:
[::]Internet Fail. File: main.c, Line:
[::]==== Invalid write of size
[::]==== at 0x8414: f (badapp1.c:)
[::]==== by 0x842F: main (badapp1.c:)
[::]==== Address 0x496f050 is bytes after a block of size alloc'd
[::]==== at 0x483481C: malloc (in /opt/valgrind/lib/valgrind/vgpreload_memcheck-arm-linux.so)
[::]====
[::]====
[::]==== HEAP SUMMARY:
[::]==== in use at exit: bytes in blocks
[::]==== total heap usage: allocs, frees, bytes allocated
[::]====
[::]==== bytes in blocks are definitely lost in loss record of
[::]==== at 0x483481C: malloc (in /opt/valgrind/lib/valgrind/vgpreload_memcheck-arm-linux.so)
[::]====
[::]==== LEAK SUMMARY:
[::]==== definitely lost: bytes in blocks
[::]==== indirectly lost: bytes in blocks
[::]==== possibly lost: bytes in blocks
[::]==== still reachable: bytes in blocks
[::]==== suppressed: bytes in blocks
[::]====
[::]==== For counts of detected and suppressed errors, rerun with: -v
[::]==== ERROR SUMMARY: errors from contexts (suppressed: from )

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.

参考:Where does the name 'Valgrind' come from?

6、如何利用Valgrind结果?


参考:

1、应用 Valgrind 发现 Linux 程序的内存问题

2、Valgrind 基础

3、Valgrind Frequently Asked Questions

4、Valgrind官网

5、Valgrind Guide

6、Valgrind Quick Start

在ARM Linux 使用 Valgrind的更多相关文章

  1. linux下valgrind的使用概述

    Valgrind简介: Valgrind是动态分析工具的框架.有很多Valgrind工具可以自动的检测许多内存管理和多进程/线程的bugs,在细节上剖析你的程序.你也可以利用Valgrind框架来实现 ...

  2. Linux下Valgrind的使用概述 来源:Linux社区 作者:dndxhej

    本地使用情况,在Ubantu系统上编写的测试性能: 1,下载:sudo apt-get install valgrind; 2,验证是否安装成功:试着valgrind ls -l来检测是否正常工作: ...

  3. ARM Linux Qt 5.x.x 无标题栏

    /********************************************************************************* * ARM Linux Qt 5. ...

  4. 构建 ARM Linux 4.7.3 嵌入式开发环境 —— BusyBox 构建 RootFS

    上一篇我们已经成功将 ARM Linux 4.7.3 的内核利用 U-BOOT 引导了起来.但是细心的你会发现,引导到后面,系统无法启动,出现内核恐慌 (Kernel Panic). 原因是找不到文件 ...

  5. 构建 ARM Linux 4.7.3 嵌入式开发环境 —— U-BOOT 引导 Kernel

    经过若干天的反复测试,搜索.终于成功利用 Qemu 在 u-boot 下引导 ARM Linux 4.7.3 内核.如下详细解释整个构建过程. 准备环境 运行环境:Ubuntu 16.04 需要的虚拟 ...

  6. ARM Linux 3.x的设备树(Device Tree)

    http://blog.csdn.net/21cnbao/article/details/8457546 宋宝华 Barry Song <21cnbao@gmail.com> 1.     ...

  7. ARM Linux启动代码分析

    前言 在学习.分析之前首先要弄明白一个问题:为什么要分析启动代码? 因为启动代码绝大部分都是用汇编语言写的,对于没学过或者不熟悉汇编语言的同学确实有一定难度,但是如果你想真正深入地学习Linux,那么 ...

  8. ARM Linux 3.x的设备树(Device Tree)

    1. ARM Device Tree起源 Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称“this whole ARM thing is a f*cking pai ...

  9. ARM Linux从Bootloader、kernel到filesystem启动流程

    转自:http://www.veryarm.com/1491.html ARM Linux启动流程大致为:bootloader ---->kernel---->root filesyste ...

随机推荐

  1. POJ3356 – AGTC(区间DP&&编辑距离)

    题目大意 给定字符串X和Y,可以对字符串进行一下三种操作: 1.删除一个字符 2.插入一个字符 3.替换一个字符 每个操作代价是1,问运用以上三种操作把X变为Y所需的最小步数是多少? 题解 定义dp[ ...

  2. 四舍六入五成双银行家算法的 PHP和Javascript实现

    四舍六入五成双 http://baike.baidu.com/view/1245064.htm?fr=aladdin 四舍六入五成双是一种比较精确比较科学的计数保留法,是一种数字修约规则. 对于位数很 ...

  3. oc学习之路----APNS消息推送从证书到代码(2015年4月26号亲试可用)

    前言:看这篇博客之前要准备:首先的有一个99刀的个人开发者账号或者199刀的企业开发者账号,其次你用的是apns消息推送,(本人之前四处打听有没有其他消息推送的方法:收获如下:首先如果想做到apns的 ...

  4. linux下查询域名或IP注册信息的操作记录(whois)

    在运维工作中,有时需要查询某些域名的注册信息(域名的NS,注册用户,注册邮箱等),可以使用whois这个命令.whois命令令用来查找并显示指定帐号(或域名)的用户相关信息,因为它是到Network ...

  5. ASP.NET MVC- Model- An Introduction to Entity Framework for Absolute Beginners

    Introduction This article introduces Entity Framework to absolute beginners. The article is meant fo ...

  6. WinForm Excel导入

     主要代码如下: 定义一个DataSet   存放Excel读取的数据 /// <summary> /// Excel 表中读取的数据 /// </summary> publi ...

  7. Override ListView getAdapter造成的后果

    近期工作中,发现了一个bug,是和ListView Adapter有关的.产生了FC,描写叙述信息大约是 "The content of the adapter has changed bu ...

  8. [React Native] Up and Running

    We'll download the requirements for getting started with React Native, refactor our app to ES6, walk ...

  9. java12 File类

    )File类 )IO流的原理及概念 )IO流的分类 )IO流类的体系 )字节流和字符流 )处理流 )文件拷贝 )处理流 )文件拷贝 )文件分割与合并 File:文件和目录路径名的抽象表示形式,一个Fi ...

  10. RHCA442学习笔记-Unit11内存回收

       Unit 12 Memory Reclamation 内存回收            学习目标:                    A. 了解和调整内存回收                  ...