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

7
我正在开发基于Linux内核的Android手机。我使用kmsg来记录内核日志,使用adb logcat -v time来记录平台日志。问题是内核日志显示的时间从0.000000开始,而logcat则从系统启动时间开始显示(例如,如果手机上的时间是10:43:00,则它将显示从此时间开始的第一条日志)。
现在我无法比较这两个日志中的事件,因为时间基准(参考)不同。请问有谁能指出如何同步这两个时间?
5个回答

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时间戳之间的关系。


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

Pavan,

也许你可以在logcat打印中加上自开机后的时间?这应该会更接近在kmsg中显示的时间。

自开机后的时间可以用elapsedRealtime()来获取。


@willytale:非常感谢!它运行得很好 :) 但问题是我需要在每个日志中添加elapsedRealtime()!所以我查看了logcat代码。时间格式化是在logprint.cppandroid_log_formatLogLine()中完成的。但是elapsedRealtime()在Java中,我不知道如何从cpp文件中访问它。我无法找到一个等效的东西,可以从这个cpp文件中使用。 - Pavan Manjunath
Android NDK 提供了 C/C++ 的日志 API:https://manski.net/2012/05/logging-from-c-on-android/。 - AIYA

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时间值不会增加,而壁钟时间显然会增加。为此,您将必须在每次挂起进入和退出时重新同步壁钟时间,以获取正确的壁钟时间。

1

我认为它可以这样使用:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接