6.10.3 Linux カーネルモジュールのデバッグについて

Linux カーネルモジュールには、カーネルの機能を拡張する方法が用意されており、通常はデバイスやファイルシステムドライバなどに使用されます。モジュールはカーネル内に組み込むか、またはロード可能なモジュールとしてコンパイルすることができます。その後は、カーネルを頻繁に再コンパイルしなくても、開発時に実行中のカーネルからダイナミックに挿入および削除できます。ただし、モジュールによってはカーネルに組み込む必要があり、ダイナミックなロードに適さないものがあります。組み込みモジュールの例としては、カーネルのブート時に必要であり、ルートファイルシステムをマウントする前に使用可能でなければならないものがあります。
モジュールのデバッグ情報をデバッガにロードすると、ソースレベルのブレークポイントをモジュールに設定できます。例えば、デバッグ情報をロードするには、add-symbol-file modex.ko を使用します。カーネルにモジュールをロードする前にモジュールにソースレベルのブレークポイントを設定するには、break -p を使用して保留ブレークポイントを作成します。カーネルにモジュールがロードされると、デバッガはシンボルをロードして保留ブレークポイントを適用します。
モジュールをデバッグするときは、ターゲット上のモジュールとホスト上のモジュールが同じであることを確認する必要があります。コードレイアウトは同じでなければなりませんが、ターゲット上のモジュールにはデバッグ情報は不要です。

組み込みモジュール

カーネルに組み込まれているモジュールをデバッグする場合の手順は、カーネル自体をデバッグする場合の手順と同じです。
  1. カーネルをモジュールとともにコンパイルします。
  2. カーネルイメージをターゲットにロードします。
  3. 関連するカーネルイメージとデバッグ情報をデバッガにロードします。
  4. 他のカーネルコードと同じようにモジュールをデバッグします。
組み込み(静的リンク)モジュールは残りのカーネルコードと区別できません。そのため、info os-modules コマンドによって表示されず、[Modules]ビューにも表示されません。

ロード可能なモジュール

ロード可能なカーネルモジュールをデバッグする手順はより複雑です。Linux ターミナルシェルから insmod および rmmod コマンドを使用して、モジュールの挿入および削除を行うことができます。カーネルとロード可能なモジュールの両方のデバッグ情報をデバッガにロードする必要があります。モジュールを挿入および削除すると、デバッガはデバッグ情報と既存のブレークポイントのメモリ位置を自動的に解決します。これを行う場合、デバッガはカーネル内の呼び出しをインターセプトして、モジュールを挿入または削除します。これにより、アクションのたびにわずかな遅延が発生し、その間デバッガはカーネルを停止してさまざまなデータ構造を調べます。ロード可能なカーネルモジュールのデバッグの詳細については、『DS-5 スタートガイド』のチュートリアルを参照して下さい。

ロード可能なモジュールを検出するには、デバッガ内で接続が確立しており、 オペレーティングシステムOSサポートが有効になっている必要があります。Linux のカーネルイメージがデバッガにロードされると、 OS サポートが自動的に有効になります。ただし、set os コマンドを使用して手動でこれを制御することもできます。
関連する概念
6.10.2 Linux カーネルのデバッグについて
6.7 ベアメタル対称型マルチプロセスシステムのデバッグについて
関連する作業
2.7 Linux カーネルへの接続の設定
関連する参考文書
3.2 アプリケーションの実行、停止、およびステップ実行
5.1 ターゲット実行環境の検査
5.2 コールスタックの検査
3.12 UNIX シグナルの処理
3.13 プロセッサ例外処理
11.4 [Breakpoints]ビュー
11.6 [Commands]ビュー
11.7 [Debug Control]ビュー
11.8 [Disassembly]ビュー
11.14 [Memory]ビュー
11.16 [Modules]ビュー
11.17 [Registers]ビュー
11.26 [Variables]ビュー
関連情報
ロード可能なカーネルモジュールのデバッグ
非機密扱いPDF file icon PDF 版ARM DUI0446WJ
Copyright © 2010-2015 ARM.All rights reserved.