2012年01月18日

Androidのadbのメモ(2) adbdの観察

今度はターゲット側で動作しているadbdをみてみます。KZM-A9-Dualボードで動かしたAndroid 4.0.3を使いました。



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つのファイルが生成されました。

adbd_strace

adbd_strace.54

adbd_strace.55

adbd_strace.56

adbd_strace.69

adbd_strace.70

最初のファイルが 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()
>


トラックバックURL

コメント一覧

1. Posted by fibre   2012年01月18日 18:51
bionic/libc/include/sys/linux-syscalls.h に以下記載があるので、謎のシステムコールはset_tlsで確定ですね。
#define __NR_ARM_set_tls (__NR_SYSCALL_BASE + 983045)
#define __NR_ARM_cacheflush (__NR_SYSCALL_BASE + 983042)
2. Posted by koba   2012年01月18日 19:24
ありがとうございます。
もうひとつ謎のSYS_224はgettidのようですね。

コメントする

名前
URL
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード