Linux用のドライバー(具体的にはubuntuサーバー9.04)をデバッグしていますが、コードにいくつかのprintfステートメントがあります。
これらのステートメントの出力はどこで確認できますか?
EDIT1:私がやろうとしていることは、procファイルシステムを使用してカーネルに書き込むことです。印刷コードは
static int proc_fractel_config_write(struct file *file, const char *argbuf, unsigned long count, void *data)
{
printk(KERN_DEBUG "writing fractel config\n");
...
Kern.logで、/ proc/net/madwifi/ath1/fractel_configファイルを上書きしようとすると、次のメッセージが表示されます(もちろん、さまざまな時間で)。
[ 8671.924873] proc write
[ 8671.924919]
説明はありますか?
ディストリビューションによって異なりますが、多くはklogd(8)
を使用してカーネルからメッセージを取得し、ファイル(場合によっては_/var/log/dmesg
_または_/var/log/kernel
_)またはシステムログに記録します。 syslog(3)
経由。後者の場合、ログエントリが最終的にどこにあるかは、syslogd(8)
の構成に依存します。
dmesg
コマンドに関する注意:カーネルメッセージは循環バッファーに格納されるため、大量の出力が上書きされます。
多くの場合、KERN_DEBUG
レベルのメッセージはフィルタリングされるため、ログレベルを明示的に上げる必要があります。 /proc/sys/kernel/printk
を調べると、システムのデフォルトが何であるかを確認できます。たとえば、私のシステムでは:
# cat /proc/sys/kernel/printk
4 4 1 7
最初の数字は、コンソールのログレベルがKERN_WARNING
であることを示しています(詳細については proc(5) のマニュアルページを参照してください)。これは、KERN_NOTICE
、KERN_INFO
、およびKERN_DEBUG
メッセージがコンソールからフィルタリングされることを意味します。ログレベルまたは詳細度を上げるには、dmesg
を使用します
$ Sudo dmesg -n 7
$ cat /proc/sys/kernel/printk
7 4 1 7
ここでは、レベルを7(KERN_DEBUG
)に設定すると、すべてのレベルのメッセージがコンソールに表示されます。これを自動化するには、loglevel=
[〜#〜] n [〜#〜]をカーネルブートパラメーターに追加します。Nはログレベルです。コンソールに移動するか、ignore_loglevel
を使用してすべてのカーネルメッセージをコンソールに出力します。
コマンドdmesg
で出力を取得します
dmesgは、カーネルからすべてのメッセージを出力します。希望するメッセージを見つけるのは難しいでしょう。 dmesgとgrepの組み合わせを使用し、すべてのprintk
メッセージでドライバー固有のラベルを使用することをお勧めします。これにより、すべての不要なメッセージを簡単に削除できます。
printk("test: hello world")
dmesg | grep test
Ubuntu 11.10および10.04 LTSでこの問題が発生しました。前者では/etc/rsyslog.d/50-default.confを編集してから、「Sudo service rsyslog restart」を使用してrsyslogを再起動し、rsyslogdを再起動しました。その後、うまくいきました。
Ubuntuはsyslogdではなく* r * syslogdを使用することに注意してください。
たとえば、KERN_INFOなど、KERN_DEBUGよりも高いレベルを試すことができます。構成によっては、優先度の最も低いメッセージが表示されない場合があります。
Centos(centos 6.6以降)では、出力は/ var/log/messagesにあります