我一直在使用两种不同的方法分析 Linux USB 驱动程序的工作原理:
- 检查 的输出
usbmon
,这是“在线”发送内容的十六进制转储视图。 - 将
printk()
语句添加到内核驱动程序模块源并将其重新加载到内核中。
我可以分别通过cat /sys/kernel/debug/usb/usbmon/1u
和获取这些方法的输出cat /var/log/kern.log
。
我现在想做的是实时合并这两个文件,这样我就可以看到printk()
我插入到内核驱动程序中的日志消息与通过网络发送的十六进制行交错。例如,我可能会printk()
在一段驱动程序代码的开头和结尾放置一条语句,我知道该代码会发送 USB 数据,并且我希望能够查看十六进制(从中usbmon
发送的数据,例如
输入函数 sendImportantUSBData() // 来自驱动程序代码 printk()
0a ff bbbb ac 0993 b3332 // 来自 usbmon 日志
退出函数 sendImportantUSBData() // 来自驱动程序代码 printk()
我知道可以显示单个文件的tail
最后几行。n
我也知道该工具multitail
可以进行一些合并,尽管我没有看到任何有关时序敏感性及其对合并行顺序准确性的影响的相关细节。是否有一种适合我所描述的工具,可以a)
准确合并时间敏感的日志,或者b)
允许指定一个相对较小的时间间隔来进行合并?在后一种情况下,我可能可以在关键点将睡眠语句插入到驱动程序代码中,以确保合并工具printk()
在驱动程序进入下一个 USB 事务之前有时间读取我的输出,该事务将从usbmon
.
答案1
怎么样tail -F /sys/kernel/debug/usb/usbmon/1u /var/log/kern.log
?这将“跟踪”两个文件的输出,并在显示每个其他文件的输出时打印一个短标题。
答案2
如果您不想进行大量编程,那就太简单了,
假设您将log1
和混合log2
,结果为log
:
在后台监视 log1,并将更改附加到日志tail -f log1 >> log &
在log2上启动另一个进程监控tail -f log2 >> log &
为了作证,尝试
echo ok1 >> log1; echo ok2 >> log2
现在如果你检查log
,你会得到
好的1
好的2
答案3
即使我一直在寻找这个例子..我已经将其用于不同的目的并对结果感到满意。我已将输出重定向到如下文件:tail -F /sys/kernel/debug/usb/usbmon/1u /var/log/kern.log >> tail.output 我每秒三次获得两个不同实时日志的合并输出。非常感谢 jippie :-)