2011-06-13 367 views
6

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

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

回答

2

Pavan,

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

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

+0

@willytale:非常感谢!它工作正常:)但问题是我需要在每个日志中添加'elapsedRealtime()'!所以我检查了logcat代码。时间格式化在'logprint.cpp'的'android_log_formatLogLine()'中完成。但'elapsedRealtime()'在java中,我不知道如何从cpp文件访问它。我无法找到一个可以从这个cpp文件中使用的等效物 – 2011-06-15 10:13:21

1

我认为它可以用这样的:

adb shell logcat -v time -f /dev/kmsg | adb shell cat /proc/kmsg >sample.txt 
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时间值不会增加。为此,为了获得正确的挂钟时间,您必须在每次挂起进入和退出时重新同步挂钟时间。

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时间检查logcat,则内核消息将同时包含logcat和内核时间戳。当然,两者之间可能会有延迟。

另外,更简单的看交错的消息的方法是:

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

但在这种情况下,它是一个有点难以辨认从内核来的消息,而你不能告诉时间戳如何内核涉及到logcat时间戳。

+0

这种方法很酷〜谢谢 – 2013-03-19 07:45:15