SIMフリー版(国際版) Galaxy S4 において、 Android 4.3 を入れたものを借りた時のお話です。タイトルにあるとおり、「ネイティブデバッグ(ndk-gdb)が使用不可能」という状態でした。これについて色々と調べて、とりあえずは納得のいく結論(?)までたどり着きました。
大きくは、4.3系の定番の不具合である run-as 問題の範疇だと思います。今回の場合においては、package list のファイルが指定場所にない、とかではなく別の問題でした。
Android 4.3 の run-as 問題は Nexus 7で出遭っている人が多いようです。その場合、/data/system/packages.list が読み込めないでエラーとなっているようです。結果 run-as コマンドが失敗して、デバッガ起動も失敗するという流れとなっています。
これらの情報は、下記のチケットに上がっているようです。
テストが追加されたようなので今後(4.4?)では、同じような問題は出ないと思われます。
なお、Nexus 7においては、4.3.1 が存在しており、これを使うことで問題は解決できた、と話を聞いています。そのときの情報がブログにまとめられていました(こちら:NEXUS7 2013 LTE で ndk-gdb-py が失敗する)
さて、Galaxy S4についてはどのようなことが起こっていたかというと、selinux によるセキュリティ権限設定回りが妙な動作状態となっていました。本来ならば、指定されたユーザーで起動しているはずの gdbserver が、root ユーザーで起動している状態となっていました。
下記、hello-jni のサンプルを起動させてみた時の調査結果です。まずは Galaxy S4 から。
u0_a202 11940 207 870632 14504 ffffffff 00000000 t com.example.hellojni u0_a202 11968 291 516 4 ffffffff 00000000 S lib/gdbserver shell 11974 11268 1188 472 00000000 b6ef3424 R ps shell@jflte:/etc $ run-as com.example.hellojni run-as com.example.hellojni selinux_android_seapp_context_reload: seapp_contexts file is loaded from /seapp_ contextsshell@jflte:/data/data/com.example.hellojni $ cd /proc/11969 cd /proc/11969 # gdbserver が 11968 なので. shell@jflte:/proc/11969 $ ls -l ll dr-xr-xr-x shell shell 2013-01-10 21:38 attr -r-------- root root 0 2013-01-10 21:38 auxv -r--r--r-- root root 0 2013-01-10 21:38 cgroup --w------- root root 0 2013-01-10 21:38 clear_refs -r--r--r-- root root 0 2013-01-10 21:38 cmdline -rw-r--r-- root root 0 2013-01-10 21:38 comm -rw-r--r-- root root 0 2013-01-10 21:38 coredump_filter -r-------- root root 0 2013-01-10 21:38 environ dr-x------ root root 2013-01-10 21:38 fd dr-x------ root root 2013-01-10 21:38 fdinfo -r--r--r-- root root 0 2013-01-10 21:38 limits -rw-r--r-- root root 0 2013-01-10 21:38 loginuid -r--r--r-- root root 0 2013-01-10 21:38 maps -rw------- root root 0 2013-01-10 21:38 mem -r--r--r-- root root 0 2013-01-10 21:38 mountinfo -r--r--r-- root root 0 2013-01-10 21:38 mounts -r-------- root root 0 2013-01-10 21:38 mountstats dr-xr-xr-x shell shell 2013-01-10 21:38 net dr-x--x--x root root 2013-01-10 21:38 ns -rw-r--r-- root root 0 2013-01-10 21:38 oom_adj -r--r--r-- root root 0 2013-01-10 21:38 oom_score -rw-r--r-- root root 0 2013-01-10 21:38 oom_score_adj -r--r--r-- root root 0 2013-01-10 21:38 pagemap -r--r--r-- root root 0 2013-01-10 21:38 personality -r--r--r-- root root 0 2013-01-10 21:38 sessionid -r--r--r-- root root 0 2013-01-10 21:38 smaps -r--r--r-- root root 0 2013-01-10 21:38 stack -r--r--r-- root root 0 2013-01-10 21:38 stat -r--r--r-- root root 0 2013-01-10 21:38 statm -r--r--r-- root root 0 2013-01-10 21:38 status dr-xr-xr-x shell shell 2013-01-10 21:38 task -r--r--r-- root root 0 2013-01-10 21:38 wchan shell@jflte:/proc/11969 $ cd attr cd attr shell@jflte:/proc/11969/attr $ ll ll -rw-rw-rw- root root 0 2013-01-10 21:38 current -rw-rw-rw- root root 0 2013-01-10 21:38 exec -rw-rw-rw- root root 0 2013-01-10 21:38 fscreate -rw-rw-rw- root root 0 2013-01-10 21:38 keycreate -r--r--r-- root root 0 2013-01-10 21:38 prev -rw-rw-rw- root root 0 2013-01-10 21:38 sockcreate
問題なくデバッグ機能が動作した Nexus 7 (4.3.1) の状態は以下の通りになります。
u0_a99 7648 184 836916 21736 ffffffff 400955d4 t com.example.hellojni u0_a99 7675 265 512 256 c0138184 00027f04 S lib/gdbserver shell 7682 265 828 472 ffffffff 00000000 S /system/bin/sh shell@deb:/data/data/com.example.hellojni $ cd /proc/7675 # gdbserver が 7675 shell@deb:/proc/7675 $ ls -l dr-xr-xr-x u0_a99 u0_a99 2013-11-25 11:11 attr -r-------- u0_a99 u0_a99 0 2013-11-25 11:16 auxv -r--r--r-- u0_a99 u0_a99 0 2013-11-25 11:11 cgroup --w------- u0_a99 u0_a99 0 2013-11-25 11:16 clear_refs -r--r--r-- u0_a99 u0_a99 0 2013-11-25 11:10 cmdline -rw-r--r-- u0_a99 u0_a99 0 2013-11-25 11:16 comm -rw-r--r-- u0_a99 u0_a99 0 2013-11-25 11:16 coredump_filter lrwxrwxrwx u0_a99 u0_a99 2013-11-25 11:16 cwd -> /data/data/com.exa mple.hellojni -r-------- u0_a99 u0_a99 0 2013-11-25 11:16 environ lrwxrwxrwx u0_a99 u0_a99 2013-11-25 11:10 exe -> /data/app-lib/com. example.hellojni-1/gdbserver dr-x------ u0_a99 u0_a99 2013-11-25 11:16 fd dr-x------ u0_a99 u0_a99 2013-11-25 11:16 fdinfo -r--r--r-- u0_a99 u0_a99 0 2013-11-25 11:16 limits -rw-r--r-- u0_a99 u0_a99 0 2013-11-25 11:16 loginuid -r--r--r-- u0_a99 u0_a99 0 2013-11-25 11:16 maps -rw------- u0_a99 u0_a99 0 2013-11-25 11:16 mem -r--r--r-- u0_a99 u0_a99 0 2013-11-25 11:16 mountinfo -r--r--r-- u0_a99 u0_a99 0 2013-11-25 11:16 mounts -r-------- u0_a99 u0_a99 0 2013-11-25 11:16 mountstats dr-xr-xr-x u0_a99 u0_a99 2013-11-25 11:16 net dr-x--x--x u0_a99 u0_a99 2013-11-25 11:16 ns -rw-r--r-- u0_a99 u0_a99 0 2013-11-25 11:10 oom_adj -r--r--r-- u0_a99 u0_a99 0 2013-11-25 11:16 oom_score -rw-r--r-- u0_a99 u0_a99 0 2013-11-25 11:16 oom_score_adj -r--r--r-- u0_a99 u0_a99 0 2013-11-25 11:16 pagemap -r--r--r-- u0_a99 u0_a99 0 2013-11-25 11:16 personality lrwxrwxrwx u0_a99 u0_a99 2013-11-25 11:16 root -> / -r--r--r-- u0_a99 u0_a99 0 2013-11-25 11:16 sessionid -r--r--r-- u0_a99 u0_a99 0 2013-11-25 11:16 smaps -r--r--r-- u0_a99 u0_a99 0 2013-11-25 11:16 stack -r--r--r-- u0_a99 u0_a99 0 2013-11-25 11:10 stat -r--r--r-- u0_a99 u0_a99 0 2013-11-25 11:16 statm -r--r--r-- u0_a99 u0_a99 0 2013-11-25 11:16 status dr-xr-xr-x u0_a99 u0_a99 2013-11-25 11:10 task -r--r--r-- u0_a99 u0_a99 0 2013-11-25 11:16 wchan shell@deb:/proc/7675 $ cd attr shell@deb:/proc/7675/attr $ ls -l -rw-rw-rw- u0_a99 u0_a99 0 2013-11-25 11:11 current -rw-rw-rw- u0_a99 u0_a99 0 2013-11-25 11:11 exec -rw-rw-rw- u0_a99 u0_a99 0 2013-11-25 11:11 fscreate -rw-rw-rw- u0_a99 u0_a99 0 2013-11-25 11:11 keycreate -r--r--r-- u0_a99 u0_a99 0 2013-11-25 11:11 prev -rw-rw-rw- u0_a99 u0_a99 0 2013-11-25 11:11 sockcreate
比較してわかるとおり UIDのセットが Galaxy S4(4.3)では正しく行われておらず、run-as コマンドの結果が期待するものになっていないために正常にネイティブデバッグ(ndk-gdb, ndk-gdb-py) らが出来なかったという結論に至りました。
コメント
[…] 以前 Android 4.3 (JB) を入れてしまった Galaxy S4 でデバッグができない!と嘆いていましたが、最近 KitKat (4.4) のファームウェアが公開されたのでこれを導入してみることにしました。 […]