valgrind on Android

0x00 背景


//下面的方法程序会crash。。。

0x01 方法

  1. 下载googlesamples并编译安装hello-jni到android作为目标程序。

  2. 下载valdroid并push到手机的/data/local/valdroid/目录里。

  3. 创建这两个脚本,并执行sh bootstrap_valgrind.sh
    //bootstrap_valgrind.sh

    #!/usr/bin/env bash
    
    PACKAGE="com.example.hellojni"
    
    adb push start_valgrind.sh /data/local/valdroid
    adb shell su -c "chmod 777 /data/local/valdroid/start_valgrind.sh"
    
    
    adb shell su -c "setprop wrap.$PACKAGE 'logwrapper /data/local/valdroid/start_valgrind.sh'"
    
    echo "wrap.$PACKAGE: $(adb shell getprop wrap.$PACKAGE)"
    
    adb shell am force-stop $PACKAGE
    adb shell am start -a android.intent.action.MAIN -n $PACKAGE/.HelloJni
    
    adb logcat -c
    adb logcat
    
    exit 0
    

    //start_valgrind.sh

    #!/system/bin/sh
    
    PACKAGE="com.example.hellojni"
    
    # Callgrind tool
    VGPARAMS='-v --error-limit=no --trace-children=yes --log-file=/data/local/valdroid/valgrind.log.%p --tool=callgrind --callgrind-out-file=/data/local/valdroid/callgrind.out.%p'
    
    # Memcheck tool
    # VGPARAMS='-v --error-limit=no --trace-children=yes --log-file=/sdcard/valgrind.log.%p --tool=memcheck --leak-check=full --show-reachable=yes'
    
    export TMPDIR=/data/data/$PACKAGE
    
    exec /data/local/valdroid/bin/valgrind $VGPARAMS $*
    
  4. /data/local/valdroid/就可以看到valgrind.out.xxxxcallgrind.out.xxx这两个log文件了。