2012年01月18日
Androidのadbのメモ(2) adbdの観察
straceでadbdをトレースする
init.rcを以下のように変更して動かします。
--- init.rc.old 2012-01-18 11:19:14.000000000 +0900 +++ init.rc 2012-01-18 11:20:06.000000000 +0900 @@ -353,7 +353,8 @@ start console # adbd is controlled via property triggers in init..usb.rc -service adbd /sbin/adbd +#service adbd /sbin/adbd +service adbd /system/xbin/strace -ff -o /data/local/tmp/adbd_strace /sbin/adbd class core disabled
6つのファイルが生成されました。
最初のファイルが execveで/sbin/adbdを実行しています。残りの5つは全てここからcloneされたスレッドです。
syscall_983045という謎のシステムコールが使われています。おそらくARM特有のシステムコールです。各スレッドの最初で使われていることから想像すると、set_tls (TLS:Thread Local Storage)ではないでしょうか。
最初のスレッドはselectで何度か受信して、最後は待ち状態になっていました。55と56はすぐに終了しているので、残っているスレッドは4つです。
PARTNER-Jetでadbdのスタックトレースを見る
PARNER-JetのAndroidデバッグ機能を使ってadbdのスタックトレースを見てみます。
まず、psコマンドでadbdのプロセスIDを調べます。
>ps 1: 1(0x1) /init [ init ] 1: 38(0x26) /init [ ueventd ] 1: 39(0x27) /system/bin/servicemanager [ servicemanager ] ... 1: 51(0x33) /system/bin/ash [ sh ] 1: 52(0x34) /system/xbin/strace [ strace ] 1: 53(0x35) /sbin/adbd [ adbd ] 1: 54(0x36) child-thread [ adbd ] 1: 69(0x45) child-thread [ adbd ] 1: 70(0x46) child-thread [ adbd ] 0: 87(0x57) /system/bin/app_process [ system_server ] (system_server) 0: 89(0x59) child-thread [ GC ] 1: 91(0x5b) child-thread [ Signal Catcher ] ...
adbdのプロセスIDは53でした。このプロセスにアタッチします。
>attach 53 PID:53を仮アタッチ登録しました lsa "n:\opt\koba\android-ics.kzm\out\target\product\generic\symbols\sbin\adbd" Loading file name : n:\opt\koba\android-ics.kzm\out\target\product\generic\symbols\sbin\adbd Loading Debug info. : dwarf2/3 (GCC) Loading Time : 0.046 sec Debug information : 0.046 sec
アタッチしたプロセスのスレッド一覧を確認します。
>thread pid:53(0x35) task_struct:CA1FADC0 pc:0000825C adbd :select.S : 12 : 0000825C select+14() pid:54(0x36) task_struct:C9823B00 pc:00009190 adbd :atomics_arm.S: 183 : 00009190 __futex_syscall3+C() pid:69(0x45) task_struct:C983F7E0 pc:000081AC adbd :read.S : 10 : 000081AC read+C() pid:70(0x46) task_struct:C9823140 pc:000081AC adbd :read.S : 10 : 000081AC read+C() >
kコマンドにプロセスIDを指定すると、それぞれのスレッドのスタックトレースを見ることができます。
>k 53 adbd :adb.c :1290 : 0000C62A main+87(argc=???,argv=*???) adbd :adb.c : 981 : 0000C116 adb_main+187(is_daemon=0,server_port=13AD) adbd :fdevent.c : 378 : 0000D2B2 fdevent_loop+92() adbd :select.S : 12 : 0000825C select+14() >k 54 adbd :pthread.c : 362 : 0001FC6C pthread_create+B8(thread_out=*???,attr=*BEE57B44,start_routine=*0001527D,arg=*00035480) adbd :pthread.c : 218 : 00020068 __thread_entry+34(func=*0001527D,arg=*00035480,tls=*???) adbd :usb_linux_client.c: 53 : 0001530E usb_open_thread+93(x=*???) adbd :pthread.c :1501 : 0001FAB4 __pthread_cond_timedwait+4C(cond=*00035484,mutex=*00035488,abstime=*00000000,clock=0) adbd :pthread.c :1477 : 0001FA4C __pthread_cond_timedwait_relative+34(cond=*00035484,mutex=*00035488,reltime=*00000000) adbd :atomics_arm.S: 183 : 00009190 __futex_syscall3+C() >k 69 adbd :pthread.c : 362 : 0001FC6C pthread_create+B8(thread_out=*???,attr=*BEE57940,start_routine=*0000EDBD,arg=*00035510) adbd :pthread.c : 218 : 00020068 __thread_entry+34(func=*0000EDBD,arg=*00035510,tls=*???) adbd :transport.c : 320 : 0000EE3A input_thread+7F(_t=*???) adbd :transport.c : 149 : 0000E50A read_packet+52(fd=D,name=*???,ppacket=*???) adbd :read.S : 10 : 000081AC read+C() >k 70 adbd :pthread.c : 362 : 0001FC6C pthread_create+B8(thread_out=*???,attr=*0000E8E5,start_routine=*00100000,arg=*00000001) adbd :transport.c : 256 : 0000E8E4 output_thread+1(_t=*???) adbd :transport.c : 277 : 0000E980 output_thread+9D(_t=*???) adbd :transport_usb.c: 55 : 0000FFC4 remote_read+19(p=*00036630,t=*00035510) adbd :usb_linux_client.c: 103 : 000154F4 usb_read+24(h=*00035480,data=*0003663C,len=18) adbd :read.S : 10 : 000081AC read+C() >
関連するページ
Android Builders SummitでADBの話をしました
Androidのadbのメモ(1) adb serverの観察
Androidのadbのメモ(5) adb shell lsを実行したときのログ
Androidのemulator consoleに簡単にコマンドを送る方法
Androidのadbのメモ(6) 直接adb serverと通信するrubyスクリプト
Androidのadbのメモ(7) Androidデバイス側でadbを動かす
Androidのadbのメモ(8) Android以外でadbを使う実験
Androidのadbのメモ(9) Android端末同士をadbでつなぐ
Androidのadbのメモ(10) adbdの起動のトリガー
Androidのadbのメモ(11) adbdのsecureモード
トラックバックURL
コメント一覧
#define __NR_ARM_set_tls (__NR_SYSCALL_BASE + 983045)
#define __NR_ARM_cacheflush (__NR_SYSCALL_BASE + 983042)
もうひとつ謎のSYS_224はgettidのようですね。