Android 4.3 に更新したら ndk-gdb できなくなった!?


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 コマンドが失敗して、デバッガ起動も失敗するという流れとなっています。

これらの情報は、下記のチケットに上がっているようです。

https://code.google.com/p/android/issues/detail?id=58373

テストが追加されたようなので今後(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) らが出来なかったという結論に至りました。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする


コメント

  1. […] 以前 Android 4.3 (JB) を入れてしまった Galaxy S4 でデバッグができない!と嘆いていましたが、最近 KitKat (4.4) のファームウェアが公開されたのでこれを導入してみることにしました。 […]