Linux カーネルモジュールには、カーネルの機能を拡張する方法が用意されており、通常はデバイスやファイルシステムドライバなどに使用されます。モジュールはカーネル内に組み込むか、またはロード可能なモジュールとしてコンパイルすることができます。その後は、カーネルを頻繁に再コンパイルしなくても、開発時に実行中のカーネルからダイナミックに挿入および削除できます。ただし、モジュールによってはカーネルに組み込む必要があり、ダイナミックなロードに適さないものがあります。組み込みモジュールの例としては、カーネルのブート時に必要であり、ルートファイルシステムをマウントする前に使用可能でなければならないものがあります。
モジュールのデバッグ情報をデバッガにロードすると、ソースレベルのブレークポイントをモジュールに設定できます。例えば、デバッグ情報をロードするには、add-symbol-file modex.ko を使用します。カーネルにモジュールをロードする前にモジュールにソースレベルのブレークポイントを設定するには、break -p を使用して保留ブレークポイントを作成します。カーネルにモジュールがロードされると、デバッガはシンボルをロードして保留ブレークポイントを適用します。
モジュールをデバッグするときは、ターゲット上のモジュールとホスト上のモジュールが同じであることを確認する必要があります。コードレイアウトは同じでなければなりませんが、ターゲット上のモジュールにはデバッグ情報は不要です。
組み込みモジュール
カーネルに組み込まれているモジュールをデバッグする場合の手順は、カーネル自体をデバッグする場合の手順と同じです。
-
カーネルをモジュールとともにコンパイルします。
-
カーネルイメージをターゲットにロードします。
-
関連するカーネルイメージとデバッグ情報をデバッガにロードします。
-
他のカーネルコードと同じようにモジュールをデバッグします。
組み込み(静的リンク)モジュールは残りのカーネルコードと区別できません。そのため、info os-modules
コマンドによって表示されず、[Modules]ビューにも表示されません。
ロード可能なモジュール
ロード可能なカーネルモジュールをデバッグする手順はより複雑です。Linux ターミナルシェルから insmod
および rmmod
コマンドを使用して、モジュールの挿入および削除を行うことができます。カーネルとロード可能なモジュールの両方のデバッグ情報をデバッガにロードする必要があります。モジュールを挿入および削除すると、デバッガはデバッグ情報と既存のブレークポイントのメモリ位置を自動的に解決します。これを行う場合、デバッガはカーネル内の呼び出しをインターセプトして、モジュールを挿入または削除します。これにより、アクションのたびにわずかな遅延が発生し、その間デバッガはカーネルを停止してさまざまなデータ構造を調べます。ロード可能なカーネルモジュールのデバッグの詳細については、『DS-5 スタートガイド』のチュートリアルを参照して下さい。
注
ロード可能なモジュールを検出するには、デバッガ内で接続が確立しており、
オペレーティングシステム (OS)サポートが有効になっている必要があります。Linux のカーネルイメージがデバッガにロードされると、 OS サポートが自動的に有効になります。ただし、set os
コマンドを使用して手動でこれを制御することもできます。