Context は、sh
syscall を通じて複数の静的実行可能バイナリを使用する Android アプリを開発しています。バイナリの 1 つは、samsung galaxy s4 携帯電話を使用すると最終的にセグメンテーション違反になるため (ただし、エミュレーターまたは Sony Xperia Tipo 携帯電話を使用する場合はそうではありません)、 http: //embetek.blogspot.com.es/2011/10/valgrind-for-arm に従ってください。いくつかのカスタム変更 (CFLAGS='-static -march=armv7-a') を含む.htmlは、最終的に
$ ldd valgrind
not a dynamic executable
$ file valgrind
valgrind: ELF 32-bit LSB executable, ARM, version 1 (SYSV),
statically linked, for GNU/Linux 3.2.0, not stripped.
ターゲットの電話 (バージョン android 4.2.2 カーネル 3.4...) にロードされ、(context.getFilesDir() + File.separator + "valgrind").canExecute()
false を返します。
実行すると、終了時にsh -c PATH...valgrind
Tellsvalgrind: can't execute: Permission denied
とステータス 126 が表示されます。
エミュレーターはカーネル 2.6 を実行しているようです...そのため、そこでadb shell
実行するvalgrind
と、カーネル バージョンの不一致について、似ているがより装飾されたことが伝えられます: 文字通り
llostatic/files/valgrind <
FATAL: kernel too old
Segmentation fault
(context.getFilesDir() + File.separator + "valgrind").setExecute()
不明な理由で失敗しています まったく行われていないために失敗していました ( dumpAssetToFile("valgrind"){/* Many things suppressed here. */ argument.setExecute() /* Done wrong without a files dir path ask */}
.
を正しくvalgrind
呼び出しているようですがmemcheck-arm-linux
、まだ認識させていません。
の実行でさえ、"sh -c \"PATH=$PATH:" + getFilesDir() + File.separator + " " + getFilesDir() + File.separator + "busybox strace valgrind -v " + BINARY + " " + ARGS + " " + "2>&1\""
私が期待することをしません。実行されるのはこれだけではありませんが、これをstderrに出力しています。
W/System.err(6918): commandStrArr[0]: sh
W/System.err(6918): commandStrArr[1]: -c
W/System.err(6918): commandStrArr[2]: PATH=$PATH:/data/data/NAMESPACE/files/ busy
box strace valgrind -v /data/data/NAMESPACE/files/BINARY ARGS 2>&1
W/System.err(6918): strace: applet not found
W/System.err(6918): valgrind: failed to start tool 'memcheck' for platform 'arm-l
inux': No such file or directory
W/System.err(6918): Error: BINARY exited with status nonzero (1).
これについての私の読みは、 をbusybox
エミュレートすることはできませんstrace
が、コマンドとして実行され、args[2]と見なされるものから引数のビューの最後まで引数として実行されます。valgrind
うまくロードされていますが、見つかりませんmemcheck
。ここでのコンテキストは、作業中のものと一緒に files ディレクトリにダンプされmemcheck-arm-linux
たアセットのed静的バイナリです。システム コールのトレースを取得できない場合、正確に何が求められているかを確認することはできません。私見ここで「プラットフォーム「arm-linux」の「memcheck」」と呼んでいるものではないというのは落とし穴です。valgrind
busybox
memcheck-arm-linux
memcheck-arm-linux
valgrind
追加情報 (cwds を抽象化してください):
$ file busybox
busybox: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for
GNU/Linux 3.2.0, stripped
[...]
$ file coregrind/valgrind
coregrind/valgrind: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically
linked, for GNU/Linux 3.2.0, not stripped
[...]
$ file memcheck/memcheck-arm-linux
memcheck/memcheck-arm-linux: ELF 32-bit LSB executable, ARM, version 1 (SYSV), st
atically linked, not stripped
なぜ有効なツールとしてvalgrind
受け入れられないように見えるのか、誰にも分かりますか?memcheck-arm-linux
memcheck