2012年01月27日

Androidのadbのメモ(5) adb shell lsを実行したときのログ

Androidのadbのメモ(3) adbのログで調べたことを使ってadb shell lsを実行したときのログを採取しました。



adb shell lsを実行したときのログ

環境変数ADB_TRACE=all にセットして、ホスト側のadb client, adb server, ターゲット側のadbdのログを採取しました。

adb_client.log

adbserver.log

adbd.log

このときのadb serverでのstraceの結果

adbserver_strace.log

lsの出力

ls_output.txt

(ToDo: シーケンス図を描く。)

adb clientとadb serverの間の通信を見ると、まず "host:version" と送ってバージョン番号を確認し、次に"host:transport-any"を送り、送信先を切り替えています。その次に送った"shell:ls" がターゲット側のadbdに転送されています。つまりclient側から見ると送り先を指定するとそのソケットがそのままターゲットにつながります。ドキュメントを見るとこれを "smart socket"と呼んでいるようです。

ターゲット側のadbdは"shell:ls"を受け取るとforkでサブプロセスを生成して実行するはずです。それをPARTNER-Jetで確認しました。

forkを実行したときのスタックトレースをPARTNER-Jetでみてみる

カーネル(vmlinux)のdo_forkにブレークポイントを設定して実行を再開します。

>bp do_fork
>g

ここでホスト側から adb shell ls を実行します。

>
        R0/R8    R1/R9    R2/R10   R3/R11    R4/R12   R5/R13   R6/R14   R7
R0-7 :00000011 BEC0D828 CA3C3FB0 00000000  0002A630 0000001C 00035632 00000002
R8-14:C0027328 CA3C2000 00000000 0002C3D8  00000000 CA3C3F98 C002ABA0
 PC  :C0055140 CPSR    :N--------------_svc SPSR    :-ZC------------_usr
 PID :51(0x33)
do_fork(clone_flags=11,stack_start=BEC0D828,regs=*CA3C3FB0,stack_size=0,parent_tidptr=*00000000,child_tidptr=*CA34EC60)
Real Time Count = 0,010s516m800u

カーネル内のdo_forkで止まりました。このときのPIDは51でした。

カーネル内部のスタックトレースは

>k
 vmlinux     :sys_arm.c   :  42 : C002ABA0 sys_fork+28(regs=*00000011)
 vmlinux     :fork.c      :1406 : C0055140 do_fork(clone_flags=11,stack_start=BEC0D828,regs=*CA3C3FB0,stack_size=0,parent_tidptr=*00000000,child_tidptr=*CA34EC60)

PID=51のプロセスのスタックトレースは

>attach 51
 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
>k 51
 adbd        :adb.c       :1290 : 0000C62A main+87(argc=0,argv=*00000000)
 adbd        :adb.c       : 981 : 0000C116 adb_main+187(is_daemon=0,server_port=13AD)
 adbd        :fdevent.c   : 495 : 0000D39C fdevent_loop+17D()
 adbd        :fdevent.c   : 515 : 0000CC10 fdevent_call_fdfunc+21(fde=*00000000)
 adbd        :transport.c : 207 : 0000F2FA transport_socket_events+FB(fd=E,events=1,_t=*00036630)
 adbd        :adb.c       : 342 : 0000BDBA handle_packet+213(p=*BEC0D964,t=*0002A630)
 adbd        :sockets.c   : 417 : 00011200 create_local_service_socket+41(name=*0003562C "shell:ls..")
 adbd        :services.c  : 468 : 00012C80 service_to_fd+201(name=*0003562C "shell:ls..")
 adbd        :services.c  : 390 : 00012900 create_subproc_thread+1D(name=*00000000)
 adbd        :fork.c      :  46 : 0001E94C fork+10()
 adbd        :snprintf.c  :  65 : 00016D68 snprintf+49(str=*00000000,n=0,fmt=*0002C298 "\bP\x03\0")
 adbd        :services.c  : 295 : 000122AC create_subprocess+55(arg0=*00025C74 "-c\0",arg1=*00035632 "ls\0",pid=*BEC0D8C8,devname=*0002C3D8 "/dev/pts..")
 adbd        :fork.c      :  46 : 0001E94C fork+10()
 adbd        :__fork.S    :  10 : 00008E44 __fork+C()
>


トラックバックURL

コメントする

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

QRコード
QRコード