Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
303 views
in Technique[技术] by (71.8m points)

Can't run a Java Android program with Valgrind

I'm trying to start a Java program under Valgring like this (in adb shell):

valgrind am start -a android.intent.action.MAIN -n com.me.myapp/.MainActivity

I'm getting:

==2362== Memcheck, a memory error detector
==2362== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==2362== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==2362== Command: am
==2362== 
/system/bin/sh: am: No such file or directory
Question&Answers:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You have to create a script, lets call it start_valgrind.sh

#!/system/bin/sh

PACKAGE="com.example.hellojni"

# Callgrind tool
#VGPARAMS='-v --error-limit=no --trace-children=yes --log-file=/sdcard/valgrind.log.%p --tool=callgrind --callgrind-out-file=/sdcard/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/Inst/bin/valgrind $VGPARAMS $* 

that should be copied to the device.

Once you have the above script in the start_valgrind.sh file somewhere on your local filesystem you can just use the below script (lets call it bootstrap_valgrind.sh) to do the all the work (copies the start_valgrind.sh script to the phone, runs it, starts your app through Valgrind).

#!/usr/bin/env bash

PACKAGE="com.example.hellojni"

adb push start_valgrind.sh /data/local/
adb shell chmod 777 /data/local/start_valgrind.sh 

adb root
adb shell setprop wrap.$PACKAGE "logwrapper /data/local/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 

WARNING: Make sure the property name set with setprop i.e. (wrap.com.yourcompany.yourapp) has a length of less than 31 characters.
Otherwise, you'll get the error "could not set property" because you CANNOT set a property name with a length greater than 31, which is the number maximum allowed characters in the property name.
Also the property value should be <= 91 characters: https://stackoverflow.com/a/5068818/313113


For how to build Valgrind for Android (ARM) see my script from here: https://stackoverflow.com/a/19255251/313113


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...