• 検索結果がありません。

関数呼び出しトレース

第 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修正

33

33

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

デバイスID

SubSystemID

サブシステムID

RevisionID

リビジョンID

RSW1

インタフェースモジュール識別ロータリスイッチ(RSW1)

I/O address I/Oポートアドレス

Memory address

メモリアドレス

irq

割り込み番号

この値が異常の場合(I/Oポートアドレスや割り込み番号が0と表示された場合)は、ハードウェアが 原因ということも考えられます。

6 章 リファレンス

関数の詳細説明についてはHelpを参照してください。

関連したドキュメント