前言
valgrind是linux下非常强大的工具,通过 NDK编译,让其在安卓环境下定位C/C++的问题。
一、材料
wget http://valgrind.org/downloads/valgrind-3.12.0.tar.bz2
ndk-r14b
二、使用步骤
1.阅读README.android
#!/bin/sh
export NDKROOT=/home/xxxx/android-ndk-r14b
export HWKIND=generic
export AR=$NDKROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar
export LD=$NDKROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ld
export CC=$NDKROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
export CXX=$NDKROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++
export RANLIB=$NDKROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ranlib
bash autogen.sh
export CPPFLAGS="--sysroot=$NDKROOT/platforms/android-21/arch-arm"
export CFLAGS="--sysroot=$NDKROOT/platforms/android-21/arch-arm"
./configure --prefix=/data/local/tmp/Inst --host=armv7-unknown-linux --target=armv7-unknown-linux --with-tmpdir=/sdcard
make
make install DESTDIR=`pwd`/valgrind
–prefix=/data/local/tmp/Inst 这里要和安卓机器上的地址一致。编译时,可能出现错误,Elf32_Nhdr这个定义和ndk重复了,grep一下valgrind的源码 ,发现这个结构体用不上了,索性直接将valgrind中的该结构体直接改名字。再次执行,发现可以构建成功。
m_coredump/coredump-elf.c:147:4: error: conflicting types for 'Elf32_Nhdr'
Elf32_Nhdr;
^
In file included from /home/cdduan/android-ndk-r14b/platforms/android-21/arch-arm/usr/include/elf.h:32:0,
from m_coredump/coredump-elf.c:56:
/home/android-ndk-r14b/platforms/android-21/arch-arm/usr/include/linux/elf.h:421:3: note: previous declaration of 'Elf32_Nhdr' was here
} Elf32_Nhdr;
2.编写测试代码
代码如下(示例):
#include <stdio.h>
#include <stdlib.h>
char* getMemory()
{
char *p = (char *)malloc(30);
return p;
}
int main()
{
char *p = getMemory();
p = NULL;
return 0;
}
CMakelists.txt
cmake_minimum_required (VERSION 3.5)
project(test01)
add_compile_options(-fstack-protector-all -g)
add_executable(test01 main.c)
SET(EXECUTABLE_OUTPUT_PATH ../bin)
cmake中不要写test,默认test工程是自身携带的 ,生成会报错。
编译:cmake -DCMAKE_TOOLCHAIN_FILE=/home/xxxx/android-ndk-r14b/build/cmake/android.toolchain.cmake -DANDROID_ABI=“armeabi-v7a” -DANDROID_PLATFORM=android-21 -DANDROID_TOOLCHAIN=clang -DANDROID_STL=gnustl_static …/src/
-------------------------------新增-------------------------------------------------
LINUX下编译方法
cd valgrind-3.17.0/
mkdir install
./autogen.sh
./configure --prefix=/data/songpan/cdduna/valgrind-3.17.0/install
make
make install
cd install/
编译完成后
valgrind --tool=memcheck --leak-check=full --log-file=./valgrind_report.log xx
如果是从别的地方拷贝过来 ,需要设置一下valgrind的环境变量
export VALGRIND_LIB=/data/local/tmp/Inst/lib/valgrind/libexc/valgrind
3.导入设备
adb链接设备
1.adb devices
2.adb push D:\software\Inst\bin /data/local/tmp/Inst
3.adb push D:\software\Inst\lib /data/local/tmp/Inst
4.adb push D:\software\Inst\share /data/local/tmp/Inst
5.adb push D:\software\test01 /data/local/tmp/test01
5.adb shell
6.进入tmp目录 ,设置环境变量export VALGRIND_LIB=/data/local/tmp/Inst/lib/valgrind
7.修改valgrind和memcheck的权限
8…/Inst/bin/valgrind --tool=memcheck --leak-check=full --log-file=./valgrind_report.log ./test01
结果展示:
总结
同样的工具在我的华为mate10(安卓10版本)扫描不出任何结果 ,但是放在酷派手机(安卓4.3)上就可以扫描出结果,查看valgrind的readme,支持的安卓版本较低。