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);


トラックバックURL

コメントする

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

QRコード
QRコード