6

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

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

4

5 回答 5

6

另一种解决方案类似于 jpg 的答案,但在另一个方向上,将内核消息重定向到 logcat。这更好,因为太多的 logcat 消息可能会使串行控制台超载(如果您有它处于活动状态)。

您可以在 android shell 中运行它:

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

或者在主机外壳中:

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

于 2013-02-10T15:23:44.663 回答
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

于 2012-01-16T10:03:47.110 回答
2

上面描述的单文件方法很好,但可能并不总是有用,因为来自 logcat 和 kmsg 的输入可能由于缓冲而延迟。所以你很可能会看到一个 kmsg 条目块,然后是一个 logcat 条目块,它们可能仍然是实时交错的。

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

<6>[249485.550811] 暂停:退出暂停,ret = 0 (2012-12-27 16:16:46.300872527 UTC)

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

于 2012-12-27T17:00:30.203 回答
2

帕万,

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

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

于 2011-06-13T11:22:41.137 回答
1

我认为它可以这样使用:

adb shell logcat -v time -f /dev/kmsg | adb shell cat /proc/kmsg >sample.txt
于 2012-07-11T08:58:13.800 回答