2012年01月19日
Androidのadbのメモ(3) adbのログ
adbのログについて。
adbのログのタグ
ホスト側のadbとターゲット側のadbdで共通に、以下のようにログのタグが定義されています。
bit 0 TRACE_ADB 1 TRACE_SOCKETS 2 TRACE_PACKETS 3 TRACE_TRANSPORT 4 TRACE_RWX 5 TRACE_USB 6 TRACE_SYNC 7 TRACE_SYSDEPS 8 TRACE_JDWP 9 TRACE_SERVICES
変数 int adb_trace_maskに対応するビットを立てておくことでログが出力されます。
ホスト側のadbコマンドでの指定
ソースコードのsystem/core/adb/adb.c: adb_trace_init を参照。
環境変数ADB_TRACEに文字列で指定します。"all", "1"は全部のビットが立ちます。複数指定は,:;のいずれかを区切りにして連結します。
使用例:
$ ADB_TRACE=all adb logcat
$ ADB_TRACE=transport,rwx adb shell ls
ターゲット側のadbdでの指定
ソースコードのsystem/core/adb/adb.c: start_device_log を参照。
システムプロパティの "persist.adb.trace_mask" に16進数でビットを指定します。
ログファイルは、"/data/adb/adb-%Y-%m-%d-%H-%M-%S.txt"のフォーマットのファイル名で作成されます。
使用例:adb(=bit0)とservices(=bit9)を指定するには
# setprop persist.adb.trace_mask 0x201 # stop adbd # start adbd
ホスト側のadb serverのログ
ソースコードのsystem/core/adb/adb.c: start_logging を参照。
ログファイルは /tmp/adb.log です。
ソースコードの修正
ホストのadbのログで少し動作がおかしいところがあったので修正しました。以下は全てandroid-4.0.3_r1 からの差分です。
TRACE_ADBをallとして扱わないようにする
"all", "1"で全てのビットを立てるようになっていますが、"adb"のときにも全てのビットが立ってしまうようになってしまっていました。"adb"を指定したときにはTRACE_ADBのタグのログだけ出てほしいので以下のように変更しました。
--- a/adb/adb.c +++ b/adb/adb.c @@ -82,8 +82,8 @@ void adb_trace_init(void) const char* tag; int flag; } tags[] = { - { "1", 0 }, - { "all", 0 }, + { "1", -1 }, + { "all", -1 }, { "adb", TRACE_ADB }, { "sockets", TRACE_SOCKETS }, { "packets", TRACE_PACKETS }, @@ -94,7 +94,7 @@ void adb_trace_init(void) { "transport", TRACE_TRANSPORT }, { "jdwp", TRACE_JDWP }, { "services", TRACE_SERVICES }, - { NULL, 0 } + { NULL, -1 } }; if (p == NULL) @@ -117,7 +117,7 @@ void adb_trace_init(void) if (len == taglen && !memcmp(tags[tagn].tag, p, len) ) { int flag = tags[tagn].flag; - if (flag == 0) { + if (flag == -1) { adb_trace_mask = ~0; return; }
transportのdump_hexの変更
transport.cではファイルの途中でTRACE_TAGの定義を切り替えているのですが、関数dump_hexはTRACE_TAG=TRACE_TRANSPORTで定義されているのに、この関数をTRACE_TAG=TRACE_RWXで定義されているreadx, writexから呼び出しているために、int adb_trace_maskにTRACE_TRANSPORTとTRACE_RWXのどちらかしかセットされていないときにログの表示がくずれていました。
対症療法として、dump_hex をコピーしたdump_hexxを作り、readx, writexからはdump_hexxを呼ぶように変更しました。
--- a/adb/transport.c +++ b/adb/transport.c @@ -985,6 +985,34 @@ void unregister_usb_transport(usb_handle *usb) #undef TRACE_TAG #define TRACE_TAG TRACE_RWX +#if ADB_TRACE +#define MAX_DUMP_HEXX_LEN 16 +static void dump_hexx( const unsigned char* ptr, size_t len ) +{ + int nn, len2 = len; + // Build a string instead of logging each character. + // MAX chars in 2 digit hex, one space, MAX chars, one '\0'. + char buffer[MAX_DUMP_HEXX_LEN *2 + 1 + MAX_DUMP_HEXX_LEN + 1 ], *pb = buffe + + if (len2 > MAX_DUMP_HEXX_LEN) len2 = MAX_DUMP_HEXX_LEN; + + for (nn = 0; nn < len2; nn++) { + sprintf(pb, "%02x", ptr[nn]); + pb += 2; + } + sprintf(pb++, " "); + + for (nn = 0; nn < len2; nn++) { + int c = ptr[nn]; + if (c < 32 || c > 127) + c = '.'; + *pb++ = c; + } + *pb++ = '\0'; + DR("%s\n", buffer); +} +#endif + int readx(int fd, void *ptr, size_t len) { char *p = ptr; @@ -1012,7 +1040,7 @@ int readx(int fd, void *ptr, size_t len) #if ADB_TRACE D("readx: fd=%d wanted=%d got=%d\n", fd, len0, len0 - len); - dump_hex( ptr, len0 ); + dump_hexx( ptr, len0 ); #endif return 0; } @@ -1024,7 +1052,7 @@ int writex(int fd, const void *ptr, size_t len) #if ADB_TRACE D("writex: fd=%d len=%d: ", fd, (int)len); - dump_hex( ptr, len ); + dump_hexx( ptr, len ); #endif while(len > 0) { r = adb_write(fd, p, len);