我正在尝试在Valgrind下启动这样的Java程序(在adb shell中):
valgrind am start -a android.intent.action.MAIN -n com.me.myapp/.MainActivity
我得到了:
==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
答案 0 :(得分:17)
你必须创建一个脚本,我们称之为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 $*
应该复制到设备。
在本地文件系统的某处 start_valgrind.sh 文件中有上述脚本后,您可以使用下面的脚本(我们称之为 bootstrap_valgrind.sh )来完成所有工作(将start_valgrind.sh脚本复制到手机,运行它,通过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
警告:确保使用setprop设置的属性名称(wrap.com.yourcompany.yourapp)的长度小于31个字符。
否则,您将收到错误“无法设置属性”,因为您无法设置长度大于31的属性名称,这是属性名称中允许的最大字符数。
此外,属性值应为< = 91个字符:https://stackoverflow.com/a/5068818/313113
对于如何构建适用于Android的Valgrind(ARM),请从此处查看我的脚本:https://stackoverflow.com/a/19255251/313113
答案 1 :(得分:1)
1)我使用了以下脚本来生成Inst文件夹 Android valgrind build fails
2)我正在做的错误是我没有给出所有文件夹的写权限,即MemCheck工具是在lib / valgrind下。
我的发现将生成的Inst下的所有文件夹(bin,share,inclide,lib)文件夹复制到/ data / local / Inst遍历每个文件夹并将权限设置为CHMOD 777 *
如果我没有复制所有这些文件夹1文件夹/ Inst,那么面临着像arm-linux找不到Memcheck工具的问题 如果不将chmod 777的权限设置为Hirearchy中的所有文件夹,则面临memcheck权限