第 5 章 デバッグ手法 60
5.1.1 関数呼び出しトレース
この関数呼び出しトレースを使用すると、処理の実行状況や関数呼び出し時の引数の値を容易に 知ることができます。では実際にデバッグ支援機能を使用して、先程作成したサンプルプログラ ムを動かします。
関数呼び出しトレースを指定して、ドライバを組み込みます。
(‘=’の前後にスペースは要りません)
#insmod rcp3100 rcp3100_debuglevel=1
次にインタフェースモジュールの初期化, 1件のAD入力, 終了処理を行うモジュール(「sample1.c」
で作成したsample1.o)を組み込んでみます。
#insmod sample1.o
現段階では、AdOpenEx関数とAdInputAD関数が呼び出されているはずです。
それでは、ログを確認します。
#less /var/log/messages
・・・
Jun 3 18:15:30 localhost kernel: rcp3100:AdOpenEx(0xc3d, 0x1, 0x0, [0xc6db22a4]) Jun 3 18:15:30 localhost kernel: AdOpenEx success!! [device no=1]
Jun 3 18:15:30 localhost kernel: rcp3100:AdInputAD(1, 2, 1, [0xc18c7efc], [0xc18c7ef8])
(END)
ログにもAdOpenEx関数, AdInputAD関数の順番に呼び出されていることが分かります。ログ中の[ ] で表されている部分は、引数がポインタの場合の変数のアドレスを示しています。
次に組み込んだsample1.oを取り外します。
#rmmod sample1
ログを見てみます。AdClose関数が呼び出されていることが分かります。
#less /var/log/messages
・・・
Jun 3 18:17:21 localhost kernel: rcp3100:AdClose(1) (END)
以上のように、関数が呼ばれた順番にログが残されています。
5.1.2 エラー情報
エラー情報を出力するように設定しておくと、関数のエラーコードよりも詳細なエラー情報を出 力します。
では、エラー情報出力を指定してドライバを組み込みます。
#insmod rcp3100.o rcp3100_debuglevel=2
「sample1.c」の33行目を以下のように修正してください。
sample1.c修正
3333
smp_ch_req[i].ulChNo = 1 + i;
↓
smp_ch_req[i].ulChNo = 1;
コンパイルしてモジュールを組み込んでください。
#make
#insmod sample1.o
sample1.o: init_module: そのようなファイルやディレクトリはありません
Hint: insmod errors can be caused by incorrect module parameters, including invalid IO or IRQ parameters
エラーが出てドライバモジュールを組み込むことができません。
それでは、ログを見ます。
#less /var/log/messages
Jun 3 18:18:33 localhost kernel: rcp3100:ulChNo parameter error Jun 3 18:18:33 localhost kernel: AdInputAD error [DeviceNo=1 ret=c0001021]
最後の行には、プログラム中で記述した部分が表示され、エラーコードより引数パラメータの値 が不正であることがわかります。さらに、その上の行を見ると、
ulChNo parameter errorという文字
が残されているため、ulChNoメンバ変数のパラメータ指定が間違っていることが分かります。5.1.3 インタフェースモジュールリソース情報
インタフェースモジュールのリソースが正常かどうかを見ることにより、ソフトウェアが原因か ハードウェアが原因かを知ることができます。
では、インタフェースモジュールリソース情報を出力します。
#insmod rcp3100.o rcp3100_debuglevel=4
インタフェースモジュールリソース情報は、ドライバを組み込んだ時点で出力されます。
ではログを見ます。
#less /var/log/messages
Jun 4 11:32:35 localhost kernel: rcp3100:install device:
Jun 4 11:32:35 localhost kernel: rcp3100: DeviceNo.1:
DeviceID=3133, SubSystemID=0x1, RevisionID=0x1, RSW1=0x0
Jun 4 11:32:35 localhost kernel: rcp3100: I/O address0=0xd000, I/O address1=0x0, Memory address=0x0, irq=7
拡張スロットに実装されているrcp3100が対応しているPCIインタフェースモジュールのリソース が表示されます。
項 目 内 容
DeviceNo
デバイス番号DeviceID
デバイスIDSubSystemID
サブシステムIDRevisionID
リビジョンIDRSW1
インタフェースモジュール識別ロータリスイッチ(RSW1)I/O address I/Oポートアドレス
Memory address
メモリアドレスirq
割り込み番号この値が異常の場合(I/Oポートアドレスや割り込み番号が0と表示された場合)は、ハードウェアが 原因ということも考えられます。
第 6 章 リファレンス
関数の詳細説明についてはHelpを参照してください。