3

Context は、shsyscall を通じて複数の静的実行可能バイナリを使用する 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...valgrindTellsvalgrind: 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」」と呼んでいるものではないというのは落とし穴です。valgrindbusyboxmemcheck-arm-linuxmemcheck-arm-linuxvalgrind

追加情報 (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-linuxmemcheck

4

1 に答える 1