Не удается запустить программу Java Android с помощью Valgrind

Я пытаюсь запустить Java-программу под Valgring как это (в оболочке adb):

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

Ответ 1

Вам нужно создать script, назовем его 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 $* 

который должен быть скопирован на устройство.

Как только у вас есть script в файле start_valgrind.sh где-то в локальной файловой системе, вы можете просто использовать ниже script (позволяет называть его bootstrap_valgrind.sh), чтобы выполнить всю работу (копирует файл start_valgrind.sh script на телефон, запускает его, запускает ваше приложение через 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 i.e. (wrap.com.yourcompany.yourapp), имеет длину менее 31 символа.
В противном случае вы получите сообщение об ошибке "невозможно установить свойство", потому что вы НЕ МОЖЕТЕ установить имя свойства с длиной больше 31, что является числом максимально допустимых символов в имени свойства.
Также значение свойства должно быть <= 91 символов: fooobar.com/questions/68701/...


Для создания Valgrind для Android (ARM) см. мой script отсюда: fooobar.com/questions/68703/...

Ответ 2

1) Я использовал следующий script для создания папки Inst Android valgrind build не работает

2) Ошибка, которую я делал, - это я не дал написать разрешение для всех папок, в то время как средство MemCheck находится под lib/valgrind.

Мои находки Скопируйте все папки в сгенерированном инстансе (bin, share, inclide, lib) Папка в /data/local/Inst Пройдите через каждую папку и установите разрешение CHMOD 777 *

столкнулся с проблемой Как Memcheck Tool не найден для arm-linux, если я не копировал все папки Folders 1/Inst если вы не задаете разрешение на chmod 777 для всех папок в Hirearchy

Ответ 3

Я получаю ошибки разрешения на сценарий start_valgrind.sh.

Могу ли я запустить его в приложении, которое взаимодействует с другой библиотекой Android, которая на самом деле выполняет вызовы JNI? И мне нужно взаимодействовать с ним, чтобы увидеть результаты?

Мне жаль, что это не ответ, но у меня недостаточно репутации, чтобы комментировать ответ bitek.