安卓下使用valgrind工具定位问题


前言

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,支持的安卓版本较低。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值