私は2つの異なる方法を使用してLinux USBドライバがどのように機能するかを分析しました。
- 出力を確認してください
usbmon
。これは「オンライン」で送信される内容の16進ダンプビューです。 - カーネルドライバモジュールソースにステートメントを追加し、
printk()
それをカーネルに再ロードします。
cat /sys/kernel/debug/usb/usbmon/1u
それぞれとを通じてこれらのメソッドの出力を取得できますcat /var/log/kern.log
。
今私が望むのは、2つのファイルをリアルタイムでマージして、printk()
ネットワーク経由で送信される16進行とインターリーブされたカーネルドライバに挿入されたログメッセージを表示できることです。たとえば、USBデータを送信することがわかっているドライバコードの先頭と末尾にステートメントを含めることができますprintk()
。usbmon
入力関数 sendImportantUSBData() // ドライバコードで printk()
0a ff bbbb ac 0993 b3332 // usbmon ログで関数を終了
sendImportantUSBData() // ドライバコードで printk()
tail
単一ファイルの最後の数行を表示することが可能であることを知っています。また、タイミングの感度とマージされた行の順序の正確さへの影響に関する関連情報を見たことはありませんが、n
ツールがいくつかのマージを実行できることも知っています。時間に敏感なログを正確にマージしたり、マージのために比較的短い時間間隔を指定したりできるmultitail
適切なツールはありますか?後者の場合、ドライバが。a)
b)
printk()
usbmon
答え1
どうですかtail -F /sys/kernel/debug/usb/usbmon/1u /var/log/kern.log
?これにより、2つのファイルの出力を「追跡」し、各ファイルの出力を表示するときに短いヘッダーを印刷します。
答え2
プログラミングをたくさんしたくないのであれば、とても簡単です。
log1
とを混合すると仮定すると、log2
結果は次のようになりますlog
。
バックグラウンドでlog1を監視し、ログに変更を追加します。tail -f log1 >> log &
log2で別のプロセス監視を開始するtail -f log2 >> log &
それを証明するために試してみてください。
echo ok1 >> log1; echo ok2 >> log2
今確認すればlog
得ることができます。
確認1
確認2
答え3
私はこの例を探していましたが、他の目的に使ってみましたが、結果に満足していました。出力を次のファイルにリダイレクトしました。テール -F /sys/kernel/debug/usb/usbmon/1u /var/log/kern.log >> tail.output 毎秒3回、2つの異なるライブログのマージされた出力を取得します。ジッピーは本当にありがとう :-)