2012年01月27日
Androidのadbのメモ(5) adb shell lsを実行したときのログ
adb shell lsを実行したときのログ
環境変数ADB_TRACE=all にセットして、ホスト側のadb client, adb server, ターゲット側のadbdのログを採取しました。
このときのadb serverでのstraceの結果
lsの出力
(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() >
関連するページ
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モード