理想与现实:HI3516编译Valgrind

众所周知,C/C++程序的内存问题较多。Valgrind 是一个用于构建动态分析工具的工具框架。其包含的工具可以自动检测许多内存管理和线程错误,并详细剖析程序。

于是,我希望在海思系列芯片上使用它。编译过程中遇到很多问题,然而一一解决之后却发现 Valgrind 在海思芯片上竟无用武之地。

交叉编译

首先下载源码,解压后使用如下脚本进行编译。需要注意的是

  • 修改 toolchain_dir为工具链路径;
  • 确保--hostarmv7-开头;
  • --prefix为预备置于开发板上的路径;
  • DESTDIR为编译后的安装路径。

脚本执行成功后会在DESTDIR文件夹下创建--prefix所指定的路径,并将程序安装到此。

#!/bin/sh
set -e -x

toolchain_dir=/path/to/arm-himix200-linux/arm-himix200-linux
export CC=${toolchain_dir}/bin/arm-himix200-linux-gcc-6.3.0
#export CXX=${toolchain_dir}/bin/arm-himix200-linux-g++
#export CPP=${toolchain_dir}/bin/arm-himix200-linux-cpp
export LD=${toolchain_dir}/bin/arm-himix200-linux-ld
export AR=${toolchain_dir}/bin/arm-himix200-linux-ar

./configure \
	--prefix=/mnt/valgrind \
    CC=${toolchain_dir}/bin/arm-himix200-linux-gcc-6.3.0 \
    CXX=${toolchain_dir}/bin/arm-himix200-linux-g++ \
    LD=${toolchain_dir}/bin/arm-himix200-linux-ld \
    CPP=${toolchain_dir}/bin/arm-himix200-linux-cpp \
    AR=${toolchain_dir}/bin/arm-himix200-linux-ar \
    LDFLAGS="-Wl,--rpath=./valgrind,--dynamic-linker=./valgrind/ld-linux.so.3"\
	--target=armv7-himix200-linux \
	--host=armv7-himix200-linux \
	--program-prefix=hisi-

make -j$(nproc)
make -j$(nproc) install DESTDIR=`pwd`/Inst

Valgrind 运行时需要 untripped ld-2.24.so。ld-linux.so.3ld-2.24.so的软链接。Valgrind-3.12.0 - Linux From Scratch! 中给出的方案是进行替换。然而这一操作是危险的,一旦ld-2.24.so不可用,系统也会随之损坏。

readelf -l hisi-valgrind | grep interpreter
[Requesting program interpreter: /lib/ld-linux.so.3]

脚本中的LDFLAGS修改 Valgrind 的默认链接器位置,从工具链中的arm-himix200-linux/arm-himix200-linux/target/lib/a7_softfp_neon-vfpv4文件夹拷贝ld-2.24.sovalgrind文件夹并创建软链接:

ln -s ld-2.24.so ld-linux.so.3

在测试应用程序的 CMake 文件中也加入

add_link_options(-Wl,--rpath=./valgrind,--dynamic-linker=./valgrind/ld-linux.so.3)

运行 Valgrind

valgrind文件夹拷贝到开发板上并以简单程序进行测试。

#!/bin/bash

export VALGRIND_LIB=valgrind/lib/valgrind
./valgrind/bin/hisi-valgrind --tool=memcheck --leak-check=full --vgdb=no /mnt/test
./valgrind/bin/hisi-valgrind  -v --track-origins=yes --tool=memcheck --leak-check=yes  --gen-suppressions=yes --num-callers=20 --track-fds=yes --vgdb=no ./test 

海思将内存划分成了 OS 内存和 MMZ 内存两部分,Valgrind不能正确识别 MMZ 内存的内存分配,会报出大量的错误:

==23952== Invalid read of size 1
==23952==    at 0x591EF7C: strncpy_s (in /mnt/3516_libs/libsecurec.so)
==23952==  Address 0xb6e740e1 is not stack'd, malloc'd or (recently) free'd
==23952==
==23952== Invalid read of size 4
==23952==    at 0x484CA74: memcpy (vg_replace_strmem.c:1034)
==23952==    by 0x591F01B: strncpy_s (in /mnt/3516_libs/libsecurec.so)
==23952==  Address 0xb6e740e0 is not stack'd, malloc'd or (recently) free'd
==23952==

虽然可以使用--suppressions选项进行过滤,但这样一来检查功能残缺不全,效果大打折扣。

参考资料:

  • Linux下内存统计和内存泄露类问题的定位方法
  • 海思3559A上编译Valgrind源码操作步骤
  • valgrind的使用
  • 应用 Valgrind 发现 Linux 程序的内存问题
  • 使用 Valgrind 检测 C++ 内存泄漏
  • Cross-Compiling Valgirind for ARMv7 GNU/LINUX
  • Valgrind cross compilation for ARMv5tel
  • valgrind简介以及在ARM上交叉编译运行
  • Re: [Valgrind-users] Fw:valgrind on cortrex-a9 problem
  • 2. Using and understanding the Valgrind core
  • Linux X86 程序启动 – main函数是如何被执行的?
  • hisi3531 valgrind 交叉编译移植
  • hisiv400+glibc-2.23编译
  • Valgrind for ARM with Linaro Toolchain requiring libc6-dbg with Buildroot
  • Re: [Valgrind-users] [2.4.0] Getting an “Access not within mapped region” in /lib/ld?
  • What does -/+ buffers/cache means in the output of free? [closed]
  • 【linux】free命令中cached和buffers的区别
  • Linux中用gdb 查看代码堆栈的信息
  • OpenCV getTextSize函数中的baseLine参数
  • opencv学习(十三)之文本文字插入
  • warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings] [duplicate]
  • C++ “::” 作用域符 双冒号
  • valgrind使用
  • [What]valgrind 基本安装与使用
  • The Valgrind Quick Start Guide
  • C++ - Syscall param socketcall.recvfrom(buf) points to unaddressable byte(s)
  • Valgrind-3.12.0 - Linux From Scratch!
  • What is /lib64/ld-linux-x86-64.so.2 and why can it be used to execute file?
  • How can the dynamic linker/loader itself be dynamically linked as reported by file?
  • Passing compiler options cmake
  • overwrite default /lib64/ld-linux-x86-64.so.2 to call executables
  • Multiple glibc libraries on a single host
  • Valgrind Suppression File Howto

你可能感兴趣的:(Hisilicon,Valgrind,arm)