简介
Android logcat 是一款非常强大的调试工具。 借助 Android logcat,我们可以查看系统或应用的许多有用信息。 Android 提供关于日志的 标准化 API。 在我们的开发过程中,我们可以轻松添加日志,并使用 logcat 查看项目 日志。 面向系统的 VTune™ Amplifier 是一款用于系统或应用性能调优的分析工具。 VTune Amplifier 提供功能强大的时间轴面板,以便开发人员查看当时的性能矩阵。
如何建立 logcat 消息与 VTune Amplifier 时间轴面板之间 的相关性? 开发人员通过 logcat 查看日志,或通过 VTune Amplifier 时间轴面板查看 其他性能矩阵合情合理。 这么做,我们可以了解特定时间的情形,以及当时的相关性能 数据。
英特尔® VTune™ Amplifier 可以处理和整合通过定制采集器 或您的目标应用从外部收集的性能统计数据,同时执行本地 VTune Amplifier 分析。 为 此,需要借助预先定义的结构以 csv 文件的方式提供收集到的自定义数据,并将该文件 加载至 VTune Amplifier 结果。
VTune Amplifier 用户指南详细介绍了如何创建包含外部数据 的 CSV 文件。 打开 VTune Amplifier Help 文档,前往 Intel VTune™ Amplifier > User’s Guide > External Data Import,我们可以看到包含外部数据的 CSV 文件,以及 CSV 文件格式示例。 如欲查看 VTune 时间轴面板中的 logcat 消息,请按 照指南将 logcat 消息改成 CSV 文件,并在 VTune Amplifier 中加载消息。
示例
举个例子, 我有一个 JAVA 应用,“com.example.Thread1”。 应用中的 某个函数包含多项计算。 伪代码如下所示:
void myfunction () { Log.v(“MYTEST”, “start block 1”); { ...//my computation block 1 } Log.v(“MYTEST”, “start block 2”); { ...//my computation block 2 } Log.v(“MYTEST”, “my computation finished”); }
如下列 Vtune Amplifier 时间轴面板所示,我们看到该函数执行了 6 次。 应用的主线程 ID 为 12271。 棕色栏显示的是我们在 Tune Amplifier 分析期间收 集的性能数据(CPU 时间)。
就每次函数执行来说,如果我们收集带有 “logcat -v threadtime” 的 logcat 消息,结果则如下所示:
01-12 11:13:19.090 2174 2174 V MYTEST : start block 1 01-12 11:13:19.260 2174 2174 V MYTEST : start block 2 01-12 11:13:19.500 2174 2174 V MYTEST : my computation finished
现在,我们使用可加载至 VTune Amplifier 的格式将消息从 logcat 转化成 csv 文 件。 根据 VTune Amplifier 的文档,我们拥有下列 csv 文件,例如:
name,start_tsc.UTC,end_tsc,pid,tid V/MYTEST : start block 1,2015-01-12 03:13:19.090,2015-01-12 03:13:19.090,2174,2174 V/MYTEST : start block 2,2015-01-12 03:13:19.260,2015-01-12 03:13:19.260,2174,2174 V/MYTEST:my computation finished,2015-01-12 03:13:19.500, 2015-01-12 03:13:19.500, 2174, 2174
此处我们将日志标记和消息字符串用作“名 称”。 我们将消息时间用于 start_tsc.UTC 和 end_tsc,并将 logcat 中的进程 ID 和线程 ID 用于 pid 和 tid。 字段通过逗号隔开。
在 VTune Amplifier “Analysis Type” > “Import from CSV” 中选择我们创建的 csv 文件,VTune Amplifier 将加载数据,并显示相关 logcat 消息 和该时间轴上的性能数据。 查看下列输出的截图,在消息点(黄色小三角)上移动鼠标 ,查看关于我们应用的 logcat 的所有消息。
下面介绍几点创建 CSV 文件的技巧。
- logcat 的时间就是与特定时区相关的 Android 操作系统的时间。 在 VTune Amplifier 接受的 CSV 文件中,该时间需要更改为 UTC 时间。
- CSV 文件名称应注明主机名称,定制采集器在该主机中收集数据。 例如: [user-defined]-hostname-<hostname-of-system>.csv. 就 Android 目标而言,您可以通过读取 adb shell 的文件 /proc/sys/kernel/hostname, 获取主机名称。
- 您可以在 CSV 文件的“名称”栏中自定义字符串。 在上述截图 中,我将整个 logcat 消息行作为“名称”。 请注意,如果 logcat 消息中 出现逗号,您需要删除“名称”字符串中的逗号。 逗号 “,” 是 保留的分隔符,不应出现在名称字符串中。
- 您还可以将譬如从 “dmesg” 传来的内核信息转化成 CSV 文件 ,并在 VTune Amplifier 时间轴面板中查看内核日志。 这点非常适用于系统层开发人员 ,例如,开发内核模块或设备驱动程序。 进程 ID 和线程 ID 应根据内核的消息指定为 0. 请注意,譬如从 “dmesg” 传来的内核信息时间戳是系统启动时的时间偏 移(秒)。 生成消息时,您需要将该时间戳转化为 UTC 时间。 例如,使用该方法获取 消息时间: “time of message” = “now” - “system uptime” + “timestamp of the message”。 此处的 “now” 表示系统的当前时间。 您可以借助 adb shell 的 “date” 命令获取 “now” 时间。 “system uptime” 表示系统启动耗费的时间(秒)。 您可以通过文件 /proc/uptime 获取 该时间。
脚本
我创建了一个试验性 bash 脚本,以简化操作。 您可以使用脚本 “logcat2vtune.sh” 收集 logcat 数据,并自动生成所需的 CSV 文件。 该 脚本可收集 logcat 和/或内核消息、读取目标系统信息、解析日志,并自动将日志转化 成 CSV 文件。
使用该脚本文件时,您需要 Linux 主机本地提供的 bash 环境。 如果您运行 Windows 主机,我建议您安装 Cygwin* ,它 可在 Windows 系统上提供 Linux 形式的 bash 环境。 下面是在 VTune Amplifier 分析 期间获取 CSV 文件的基本步骤。
- 在 shell 命令中,确保您可以访问 “adb”、采用合适的选项 启动 logcat2vtune.sh 脚本,例如 > ./logcat2vtune.sh -c logcat -g MYTEST
- 开始收集 VTune Amplifier 性能数据。 这一步可通过 VTune Amplifier GUI 或命令行完成。
- 停止收集 VTune Amplifier 性能数据。
- 在 logcat2vtune.sh shell 窗口中按任意键停止日志收集。 该脚本将读取 收集的日志数据、借助 bash 正则表达式解析日志,并将日志转化成 CSV 文件。 您可以 在当前 shell 文件夹中查找 .csv 文件。
- 将 CSV 文件加载至 VTune Amplifier,并通过 VTune 时间轴视图检查日 志消息。
下面提供几种脚本文件的常见使用模式。
$logcat2vtune.sh -c logcat -g MYTEST
收集 logcat 数据、使用字符串 “MYTEST” 过滤 logcat 消息,并生成 CSV 文件。 使用脚本中的以下命令 收集 logcat。
$adb shell logcat -v threadtime
“MYTEST” 是用来过滤 logcat 消息的字符串。 强烈推荐使用过滤 ,因为 logcat 可能获取非常大的日志,但我们只关注自己进程的日志。 过滤可以是 logcat 标记名称的字符串、进程 ID、线程 ID,或其他字符串。 您可以使用逗号 “,” 注明多个字符串。 通过 “-g” 选项匹配任意字符串的日 志将被解析,并生成至 CSV 文件。
$logcat2vtune.sh -c dmesg -g “MYDRIVER”
收集 “dmesg” 输出、借助 “MYDRIVER” 字符串过滤,并生成 CSV 文件。
$logcat2vtune.sh -c logcatk -g MYTEST,MYDRIVER
同时收集 logcat 数据和内核消息数据,通过字符串 “MYTEST”或 “MYDRIVER” 进行过滤,并生成 CSV 文件。 在本 案例中,您可以在 VTune Amplifier 时间轴面板中查找 logcat 的用户层日志,以及 “dmesg” 的内核层日志。 这些日志通过脚本使用以下命令从内部收集:
>adb shell logcat -v threadtime -f /dev/kmsg | adb shell cat /proc/kmsg
在本案例中,您可以借助 TID 0 查看 vmlinux 的内核日志,以及 logcat 中面 向 TID 1922 的用户层日志。
请使用命令 “logcat2vtune.sh -h” 获取关于脚本使用的更多详情。 您可以根据自己的 需要定制脚本。 请注意,该脚本为试验性脚本,未经过完全验证。 如果在脚本使用中遇 到任何问题,请随时告诉我。
本文适用于:
产品: 英特尔 System Studio 2015、英特尔 System Studio 2016
主机操作系统/平台: Windows(IA-32、英特尔 64)、Linux* (IA32、英特尔 64)
目标操作系统/平台: Android*