如何同步内核时间和logcat时间?

时间:2011-06-13 11:12:48

标签: android linux linux-kernel adb android-logcat

我正在开发基于Linux内核的Android手机。我将kmsg用于内核日志,adb logcat -v time用于平台日志。问题是内核日志显示来自0.000000的时间,并且logcat从系统时间开始显示(例如,如果手机上的时间是10.43.00,它将显示此时的第一个日志)

现在我无法比较这2个日志中的事件,因为时基(参考)不同。有人可以指出如何同步这两次吗?

5 个答案:

答案 0 :(得分:6)

另一个解决方案类似于jpg的答案,但在另一个方向,重定向 将内核消息导入logcat。这样做更好,因为太多的logcat消息可能会使串行控制台过载(如果它已激活)。

你可以在android shell中运行它:

cat /proc/kmsg | while read LINE; do echo '\06kernel\0'$LINE'\0' > /dev/log/main; done

或在主机shell中:

adb shell '(cat /proc/kmsg | while read LINE; do echo \\06kernel\\0$LINE\\0 > /dev/log/main; done)'

第一次启动命令时,您将在一个位置看到所有当前的dmesg消息,但是当它们出现时,任何其他消息都将被交错。

然后检查另一个shell中的logcat。如果使用-v time检查logcat,则内核消息将包含logcat和内核时间戳。当然,两者之间可能存在延迟。

另一种更简单的查看消息交错的方法是:

adb shell '(logcat & cat /proc/kmsg) > /path/to/log/file'

但在这种情况下,识别来自内核的消息有点困难,而且你无法分辨内核时间戳与logcat时间戳的关系。

答案 1 :(得分:5)

您可以创建包含内核和平台日志的单个文件,如下所示:

$adb shell    
$logcat -v time -f /dev/kmsg | cat /proc/kmsg > /data/klog_plog_log.txt

您可以使用平台日志中的时间戳区分两个日志。然后使用

将文件拉到本地驱动器
adb pull /data/klog_plog_log.txt > sample.txt

参考http://jai-tech.blogspot.com/2012/01/taking-kernel-and-platform-logs-of.html。希望这会有所帮助。

此致 JP

答案 2 :(得分:2)

帕,

也许您可以使用自上次启动以来的时间标记您的logcat打印件?这应该更接近kmsg所示的时间。

可以使用elapsedRealtime()检索自上次启动以来的时间。

答案 3 :(得分:2)

上面描述的单个文件方法很不错,但可能并不总是有用,因为logcat和kmsg的输入可能因缓冲而延迟。因此,您很可能会看到一块kmsg条目,然后是一块logcat条目,这些条目可能仍然是实时交错的。

也就是说,您可以通过以kmsg(grep UTC)查找设备暂停消息来同步kmsg时间和logcat时间:

< 6> [249485.550811] suspend:exit suspend,ret = 0(2012-12-27 16:16:46.300872527 UTC)

正如您所看到的那样,kmsg中的条目报告当前系统的挂钟时间,然后可以与kmsg时间值同步。但请注意,当设备处于睡眠状态时,kmsg时间值不会增加,而挂钟时间显然会增加。为此,您必须在每次暂停进入和退出时在挂钟时间重新同步,以获得正确的挂钟时间。

答案 4 :(得分:1)

我认为它可以像这样使用:

adb shell logcat -v time -f /dev/kmsg | adb shell cat /proc/kmsg >sample.txt