linuxカーネルドライバー_dev_dbg
_デバッグメッセージ(実際にはtrace
スタイルのメッセージ)を有効にする最も簡単な方法はありますか。カーネルパッチ/再コンパイルやdebugfs
?カーネル内の何か(1つのフラグのような?)を有効にして、特定のドライバまたはすべてのドライバdev_dbg( `dmesg | grep" driverName ")の出力でフィルタリングできるようにする方法があるのでしょうか?
カーネルのバージョンは_4.14
_です。実行中の_syslog/daemonlog/system
_ログはありません。ネットワークインターフェイスはなく、使用できるシリアルポートは1つだけです。ターゲットシステムは非常に遅く、非常にコンパクトであるため、syslog/etcを追加する方法はありません。次のような行の出力を表示するのに適切なdmesgしかありません。
dev_dbg(&client->dev, "bla bla bla\n");
残念ながら、debug
カーネルパラメータにbootargs
キーワードを追加することをすでに提案している投稿は、不十分でした。
_dev_info
_のような出力は問題なくdmesgに取り込まれるため、間違いなく近いものになります。ありがとう
syslog/etcをインストール/構成せずにdev_dbg
メッセージを受信する最も簡単な方法は、次の手順を実行するために必要であると思われました。
debug
キーをbootargs
カーネルパラメータに提供する
ドライバーファイルの最初の行に#define DEBUG
を追加-ドライバーが単一のファイルであり、共通のMakefileを使用している場合、またはドライバーにCC
ビルドオプション内に-DDEBUG
を追加複数のソースファイルの通常のように独自のMakefile
カーネルが起動すると、dmesg -n 8
またはecho 8 > /proc/sys/kernel/printk
を実行して、プロンプトがデバッグレベルのメッセージを有効にするように見えます
insmod <driver name>
またはmodprobe <driver name>
のいずれかのコマンドを含むモジュールの場合、またはドライバーがカーネルに統合されている場合、挿入コマンドは異なる場合があります。
カーネル統合ドライバーをi2c
バスサブシステムに割り当てる方法の例:
echo <driver name> <i2c bus address> > /sys/bus/i2c/devices/i2c-0/new_device
サイドノート:
DTSにドライバレコードの割り当てがある場合、手動で繰り返されたドライバの割り当てによりエラーが発生します-i2c
サブシステムの場合-エラーEBUSY
(-16)、ドライバはコマンドプロンプトの前に割り当てられ、dmesgメッセージはデフォルトレベルに制限されます(通常はdev_info
のみ)。
ドライバーが既にDTS
によって割り当てられており、一時的にツリーソースから除外する方法がない場合-debug
(トレース)の後でもう一度切り離して再接続すると便利ですレベルメッセージがアクティブ化されました
i2cサブシステムの場合、コマンドを実行する必要があります。
echo <driver name> > /sys/bus/i2c/drivers/<drivername>/unbind
その後
echo <driver name> > /sys/bus/i2c/drivers/<drivername>/bind
警告:
カーネルドライバーのトレースメカニズムは、内部ドライバーが正しく構成されていないか、サービス構造が不足している場合のデバッグには役立ちません。つまり、ドライバーは読み込まれているが、トレースメッセージが表示されずにメッセージが表示されないままの場合、probe
は、カーネルの予想されるサービス構造情報が欠落しているか、障害があるため、実行されたことはありません。
次のコマンドを実行して、デバッグファイルシステムを手動でマウントできます。
mount -t debugfs none/sys/kernel/debug
完了したら、次を実行します。
ls/sys/kernel/debug
すべてのデバッグ情報とメッセージは、再コンパイルせずにそこに保存されます。
また、これを/ etc/fstabの下に追加して、再起動時にマウントを自動化することもできます。
...とにかくカーネルを再コンパイルする場合は、「カーネルハッキング」で「[*]デバッグファイルシステム」を有効にすることができます。
幸運を祈ります。すべてうまくいきますように。