Android日志的格式是什么?


8

我正在尝试通过分析中的日志文件来收集有关手机的数据/dev/log。我正在专门看/dev/log/main。我一直以为任何理智的日志格式都是纯文本,但是这些文件似乎是二进制文件或某些字符集,我和我的Linux文本编辑器都无法识别。

格式是什么?

这是几个屏幕截图:

  • 首先,这是由vim^@表示空字节;我不确定其他有色控制序列)解释的日志片段: vim

  • 接下来,这是十六进制编辑器中的日志外观: 十六进制编辑器

我正在使用运行Jelly Bean的Galaxy Nexus。日志是使用root和终端模拟器收集的,因为aLogcat似乎不使用root,因此无法访问所有日志信息。

Answers:


6

如果您需要合理的信息,我建议您使用合理的命令:)(没有冒犯的意思,只是在开玩笑)。因此,问题应为:

如何从Android设备获取日志信息?

现在,我们处于更好的一面。可以使用多种方法:

  • 利用应用程序显示(颜色编码)日志信息
  • 利用ADB(Android SDK的一部分)远程提取完全相同的信息
  • 从远程(或本地终端应用程序)使用ssh直接从设备获取信息

要完全处理该主题,它需要的不仅仅是这个简单的答案(如果感兴趣,您可以在许多网站上找到更详细的信息,或者在Andrew Hoog的书《Android Forensics:Google Android的调查,分析和移动安全》中找到)。很荣幸能够翻译成德语,可能还有许多其他来源。

因此,我将在此处给出一些示例以帮助您入门:

利用应用

在这种情况下,可能最知名的应用是aLogcat,可在Playstore免费获得(开发人员会很乐意接受您为同一应用的其他变体提供的捐助)。您将在1下面找到一个屏幕截图。该应用程序允许您过滤日志,开始/停止记录日志消息,甚至将记录的片段存储到SD卡中-当然,也可以根据需要以纯文本格式存储。

本节中的另一个应用程序是Log Collector,它只是尝试获取整个可用日志并通过共享菜单2发送日志。

日志猫 日志收集器

Android调试桥(ADB)

Android软件开发套件(SDK)包含adb用于执行各种任务的命令。除其他功能外,它还提供了adb shell在设备上执行命令的功能。使用此方法,您还可以收集所需的日志信息:只需在命令下方添加adb shell

设备上的命令提示符

使用终端应用程序(例如Android Terminal EmulatorTerminal IDE),您可以直接在设备本地的命令提示符下访问日志。稍微舒适一点,可以在设备上运行ssh服务器(例如DroidSSHdDropBear SSH Server),然后从计算机访问它。这样,您就可以在大屏幕上工作,同时调查日志。

访问您的日志信息的命令

您可以使用许多强大的命令从命令行访问日志信息,这里我仅举几个例子。

dmesg

dmesg命令提取内核日志:

$ 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,您可以访问许多日志记录信息-但大多数情况下,这需要root用户。它具有一些用于过滤信息的参数,例如,通过选择要使用读取的日志缓冲区-b。请阅读logcat开发人员页面上提供的信息以了解详细信息。举两个例子:logcat -b events列出事件,或logcat -b radio有关设备无线电调制的信息。

dumpsys和dumpstate

这两个命令dumpsys,并dumpstate给你详细的系统信息:

$ dumpsys
Currently running services:
    LocationProxyService
    SurfaceFlinger
    accessibility
    account
    activity
<snip>
DUMP OF SERVICE account:
Accounts: 1
    Account {name=xxxxxxx@googlemail.com, 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>

错误报告

而且,如果您懒得bugreport忘了所有这些信息,只需使用命令-该命令将上面的代码全部调用并将其捆绑在一起,即可向开发人员报告一个不错的,嗡嗡的错误报告...

当然,您可以将所有这些命令的输出重定向到文件以复制到计算机,并且在大多数情况下,您应该这样做-因为屏幕缓冲区太小而无法处理所有内容:bugreport > /mnt/sdcard/bugreport.txt这是一个示例那部分。


$ dmesg还是dmsg?其中之一必须有错字:)
jadkik94

@ jadkik94是我最喜欢的一个,用于检查是否有人注意到...不,忘记第二部分-并感谢:)修复。
伊齐

我总是忘记哪一个是正确的:),而且总是懒得去寻找它...:P
jadkik94

3
所有人都对bash-auto-completion欢呼:)此外:我从我的书中复制粘贴了示例,然后从真实示例中复制并粘贴了示例,因此我知道哪个必须是正确的版本。 ..
Izzy

2
所做的更改与读取其他应用程序日志所需的新权限有关。目前,aLogcat只能读取自己的日志。为了使其能够从其他应用程序读取日志,您需要手动为其赋予新的权限,如下所示:adb shell pm grant com.nolanlawson.logcat android.permission.READ_LOGS
Chahk 2012年

4

对于需要解析此原始文件的开发人员(或其他有关方面),以下是一些资源:

日志格式的实际格式在以下详细说明:

为方便起见,对相关部分进行了略加注解和重新排序的副本:

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

您可以通过查看第三个字节和第四个字节来区分差异版本。格式显然也取决于平台的字节顺序。对于v1消息,__pad等于0。v2(和v3)消息使用24(0x18)。

mainradio以及system日志msg字段被解释为如下():

  • 优先级:1个字节
  • 标签:0个或多个字节
  • 文字\0作为分隔符
  • 讯息:0个或更多位元组
  • 文字\0作为终止符

如果此消息被截断,则\0可能缺少尾随。

events但是,对于日志,msg字段包含以下二进制数据:

  • 标签:“ / system / etc / event-log-tags”文件中的4字节整数键。
  • 消息:从根节点开始的序列化树。每个树节点均以AndroidEventLogType枚举的1字节值开头:
    • EVENT_TYPE_INT-节点值为4个字节的整数
    • EVENT_TYPE_LONG-节点值为8个字节的整数
    • EVENT_TYPE_STRING-节点值是4个字节的integer length,其后是length包含UTF8编码的字符串的字节
    • EVENT_TYPE_LIST节点值是一个单字节length,后跟length每个树节点AndroidEventLogType
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.