Apa format log Android?

8

Saya mencoba mengumpulkan data tentang ponsel saya dengan menganalisis file log /dev/log. Saya secara khusus melihat /dev/log/main. Saya selalu berpikir bahwa setiap format log waras akan menjadi teks biasa, namun file-file ini tampaknya biner atau dalam beberapa set karakter yang tidak dapat diidentifikasi oleh saya maupun editor teks Linux saya.

Apa formatnya?

Berikut ini beberapa tangkapan layar:

  • Pertama, inilah potongan log yang ditafsirkan oleh vim( ^@mengacu pada byte nol; Saya tidak yakin tentang urutan kontrol berwarna lainnya): vim

  • Selanjutnya, seperti inilah bentuk log di hex editor: hex editor

Saya menggunakan Galaxy Nexus yang menjalankan Jelly Bean. Log dikumpulkan menggunakan root dan emulator terminal, karena aLogcat tampaknya tidak menggunakan root dan dengan demikian tidak dapat mengakses semua info logging.

Scott Severance
sumber

Jawaban:

6

Jika Anda ingin informasi waras, saya sarankan perintah waras :) (jangan tersinggung berarti, hanya bercanda). Jadi pertanyaannya harus dibaca:

Bagaimana cara mendapatkan informasi log dari perangkat Android?

Dan sekarang kita berada di sisi yang lebih baik. Ada beberapa pendekatan yang dapat digunakan:

  • memanfaatkan aplikasi untuk menampilkan informasi log (kode warna)
  • menggunakan ADB (bagian dari Android SDK) untuk mengekstrak informasi yang sama
  • gunakan ssh dari jarak jauh (atau aplikasi terminal lokal) untuk memperoleh informasi langsung dari perangkat

Untuk sepenuhnya menangani topik ini dibutuhkan lebih dari jawaban sederhana ini (jika tertarik, Anda dapat mis. Menemukan informasi lebih rinci di banyak situs web, atau dalam buku Andrew Hoog Android Forensics: Investigasi, Analisis dan Keamanan Seluler untuk Google Android , yang saya punyai kehormatan untuk menerjemahkan ke dalam bahasa Jerman. Mungkin ada banyak sumber lain juga.

Jadi saya hanya akan memberikan beberapa contoh di sini untuk membantu Anda memulai:

Memanfaatkan aplikasi

Aplikasi yang mungkin paling dikenal dalam konteks ini adalah aLogcat , tersedia secara gratis di playstore (dan dev akan dengan senang hati menerima donasi Anda untuk varian lain dari aplikasi yang sama). Anda akan menemukan tangkapan layar di bawah 1 . Aplikasi ini memungkinkan Anda untuk menyaring log, untuk memulai / menghentikan rekaman pesan log, dan bahkan untuk menyimpan potongan rekaman ke SD-Card Anda - tentu saja dalam teks biasa, seperti yang Anda minta.

Aplikasi lain di bagian ini adalah Log Collector , yang hanya mencoba mengambil seluruh log yang tersedia dan mengirimkannya melalui menu share 2 .

aLogCat Log Collector

Jembatan Debug Android (ADB)

Kit Pengembangan Perangkat Lunak Android (SDK) mencakup adbperintah untuk berbagai tugas. Di antara banyak lainnya, ia menawarkan adb shelluntuk mengeksekusi perintah pada perangkat. Dengan menggunakan ini, Anda dapat mengumpulkan informasi log yang Anda inginkan juga: Awali saja perintah di bawah ini dengan adb shell.

Command prompt pada perangkat

Dengan menggunakan aplikasi terminal (mis. Android Terminal Emulator atau Terminal IDE ) Anda dapat mengakses log secara langsung di command prompt, secara lokal di perangkat Anda. Sedikit lebih nyaman, ini dapat dilakukan dengan menjalankan server ssh (mis. DroidSSHd atau DropBear SSH Server ) pada perangkat Anda, dan mengaksesnya dari komputer Anda. Dengan cara ini Anda dapat bekerja di layar lebar, sambil menyelidiki log Anda.

Perintah untuk mengakses informasi log Anda

Ada banyak perintah kuat yang dapat Anda gunakan untuk mengakses informasi log Anda dari baris perintah, dan saya hanya akan memberikan beberapa contoh di sini.

dmesg

The dmesgperintah ekstrak log kernel:

$ dmesg
<6>[82839.126586] PM: Syncing filesystems ... done.
<7>[82839.189056] PM: Preparing system for mem sleep
<4>[82839.189361] Freezing user space processes ... (elapsed 0.05 seconds) done.
<4>[82839.240661] Freezing remaining freezable tasks ... (elapsed 0.00 seconds) done.
<7>[82839.242279] PM: Entering mem sleep
<4>[82839.242889] Suspending console(s) (use no_console_suspend to debug)
<7>[82839.252410] vfp_pm_save_context: saving vfp state
<6>[82839.252716] PM: Resume timer in 26 secs (864747 ticks at 32768 ticks/sec.)
<6>[82842.091369] Successfully put all powerdomains to target state
<6>[82842.092468] wakeup wake lock: wifi_wake

logcat

Dengan logcat, Anda dapat mengakses banyak informasi logging - tetapi seringkali, ini membutuhkan root. Ini memiliki beberapa parameter untuk menyaring informasi, misalnya dengan memilih buffer log untuk dibaca -b. Silakan baca informasi yang disediakan pada halaman pengembang di logcat untuk detailnya. Untuk memberi Anda dua contoh: logcat -b eventsakan mendaftar acara, atau logcat -b radioinformasi tentang modul radio perangkat Anda.

dumpsys dan dumpstate

Dua perintah dumpsysdan dumpstatememberi Anda informasi sistem terperinci:

$ dumpsys
Currently running services:
    LocationProxyService
    SurfaceFlinger
    accessibility
    account
    activity
<snip>
DUMP OF SERVICE account:
Accounts: 1
    Account {[email protected], type=com.google}
<snip>
DUMP OF SERVICE alarm:

$ dumpstate
========================================================
== dumpstate: 2012-08-18 23:39:53
========================================================
Build: Gingerbread GWK74 - CyanogenMilestone2
Bootloader: 0x0000
Radio: unknown
<snip>
------ MEMORY INFO (/proc/meminfo) ------
MemTotal: 487344 kB
MemFree:   10436 kB
Buffers:   14136 kB
Cached:    145460 kB
<snip>

laporan bug

Dan jika Anda terlalu malas untuk mengingat semuanya, cukup gunakan bugreportperintah - yang memanggil semua di atas dan membundelnya untuk laporan bug yang bagus, humm, kepada pengembang ...

Tentu saja, Anda dapat mengalihkan output dari semua perintah itu ke file untuk disalin ke komputer Anda, dan dalam kebanyakan kasus Anda harus melakukannya - karena buffer layar Anda terlalu kecil untuk menangani semuanya: bugreport > /mnt/sdcard/bugreport.txtakan menjadi salah satu contoh untuk bagian itu.

Izzy
sumber
$ dmesgatau dmsg? Pasti ada salah ketik di salah satu dari ini :)
jadkik94
@ jadkik94 itu favorit saya untuk memeriksa apakah ada yang melihat ... Tidak, lupakan bagian kedua - dan terima kasih karena memperhatikan :) Tetap.
Izzy
Saya selalu lupa yang mana yang benar :) dan selalu terlalu malas untuk mencarinya ...: P
jadkik94
3
Semua menyambut bash-auto-completion :) Selain itu: Saya menyalin-menempelkan contoh-contoh dari buku saya, di mana saya menyalin-menempelkannya ke dalam contoh nyata, jadi saya tahu mana yang harus menjadi versi yang benar. ..
Izzy
2
Perubahan itu berkaitan dengan izin baru yang diperlukan untuk membaca log dari aplikasi lain . Saat ini aLogcat hanya dapat membaca lognya sendiri. Untuk membuatnya dapat membaca log dari aplikasi lain, Anda perlu secara manual memberikan izin baru seperti:adb shell pm grant com.nolanlawson.logcat android.permission.READ_LOGS
Chahk
4

Untuk pengembang (atau pihak lain yang berkepentingan) yang perlu mem-parsing file mentah ini, berikut adalah beberapa sumber:

Format aktual format log ditetapkan pada:

Salinan bagian-bagian yang relevan, sedikit beranotasi dan dipesan ulang untuk kenyamanan Anda:

#define LOGGER_ENTRY_MAX_LEN (5*1024)

struct log_msg {
    union {
        /* Maximum size of entry: 5121 bytes */
        unsigned char buf[LOGGER_ENTRY_MAX_LEN + 1];

        struct logger_entry_v3 entry;
        struct logger_entry_v3 entry_v3;
        struct logger_entry_v2 entry_v2;
        struct logger_entry entry_v1;
    } __attribute__((aligned(4)));
}
/*
 * The userspace structure for version 1 of the logger_entry ABI.
 * This structure is returned to userspace by the kernel logger
 * driver unless an upgrade to a newer ABI version is requested.
 */
struct logger_entry {
    uint16_t    len;    /* length of the payload */
    uint16_t    __pad;  /* no matter what, we get 2 bytes of padding */
    int32_t     pid;    /* generating process's pid */
    int32_t     tid;    /* generating process's tid */
    int32_t     sec;    /* seconds since Epoch */
    int32_t     nsec;   /* nanoseconds */
    char        msg[0]; /* the entry's payload */
} __attribute__((__packed__));

/*
 * The userspace structure for version 2 of the logger_entry ABI.
 * This structure is returned to userspace if ioctl(LOGGER_SET_VERSION)
 * is called with version==2; or used with the user space log daemon.
 */
struct logger_entry_v2 {
    uint16_t    len;    /* length of the payload */
    uint16_t    hdr_size; /* sizeof(struct logger_entry_v2) */
    int32_t     pid;    /* generating process's pid */
    int32_t     tid;    /* generating process's tid */
    int32_t     sec;    /* seconds since Epoch */
    int32_t     nsec;   /* nanoseconds */
    uint32_t    euid;   /* effective UID of logger */
    char        msg[0]; /* the entry's payload */
} __attribute__((__packed__));

struct logger_entry_v3 {
    uint16_t    len;    /* length of the payload */
    uint16_t    hdr_size; /* sizeof(struct logger_entry_v3) */
    int32_t     pid;    /* generating process's pid */
    int32_t     tid;    /* generating process's tid */
    int32_t     sec;    /* seconds since Epoch */
    int32_t     nsec;   /* nanoseconds */
    uint32_t    lid;    /* log id of the payload */
    char        msg[0]; /* the entry's payload */
} __attribute__((__packed__));

Anda dapat membedakan perbedaan versi dengan melihat byte ketiga dan keempat. Formatnya rupanya juga tergantung pada endianness platform Anda. Untuk pesan v1, __padsama dengan 0. pesan v2 (dan v3) menggunakan 24 ( 0x18).

Untuk main, radiodan bidang systemlog msgditafsirkan sebagai berikut ( sumber ):

  • prioritas: 1 byte
  • tag: 0 byte atau lebih
  • literal \0sebagai pemisah
  • pesan: 0 byte atau lebih
  • literal \0sebagai terminator

Jika pesan ini terpotong, jejaknya \0mungkin tidak ada.

eventsNamun untuk log, msgbidang berisi data biner berikut:

  • Tag: kunci integer 4 byte dari file "/ system / etc / event-log-tag".
  • Pesan: pohon berseri mulai dari simpul akar. Setiap simpul pohon dimulai dengan nilai 1-byte dari enumerasi AndroidEventLogType:
    • EVENT_TYPE_INT - nilai simpul adalah 4 byte integer
    • EVENT_TYPE_LONG - nilai simpul adalah 8 byte integer
    • EVENT_TYPE_STRING - nilai simpul adalah 4 byte integer length, diikuti oleh lengthbyte yang berisi string yang dikodekan UTF8
    • EVENT_TYPE_LIST - nilai simpul adalah byte tunggal length, diikuti oleh lengthsimpul pohon masing-masing AndroidEventLogType.
Lekensteyn
sumber