開発者リファレンス : プログラミング方法の概要 : Zen Programmer’s Guide : Btrieve アプリケーションのデバッグ
 
このページをシェアする                  
Btrieve アプリケーションのデバッグ
この章では、Btrieve アプリケーションのデバッグに役立つと思われる情報を示します。以下の項目が含まれています。
トレース ファイル
クライアント/サーバー環境における間接的な Chunk オペレーション
エンジンのシャットダウンと接続のリセット
ファイル内の無駄な領域の削減
トレース ファイル
MicroKernel の[トレース オペレーションの実行]設定オプションを選択すると、各 Btrieve API 呼び出しをトレースし、その結果をファイルに保存できます。これは、アプリケーションのデバッグに有効です。以下に、サンプル トレース ファイルを示します。
BUTIL STAT 呼び出しの MicroKernel トレース ファイル
MicroKernel Database Engine [Server Edition] for Windows NT trace file
Created : Wed Dec 17 18:19:09
<In> 0198   Opcode : 0026   Crs ID : 0xffffffff  Db Length : 00005   Keynum : ff   Clnt ID : 00 00 00 00 00 00 00 00 00 00 85 00 50 55 00 00
DBuf:       00 00 00 00 00          -                           .....
KBuf:       ??                      -                           .
<Out>0198   Status : 0000   Crs ID : 0xffffffff  Db Length : 00005   Keynum : ff   Clnt ID : 00 00 00 00 00 00 00 00 00 00 85 00 50 55 00 00
DBuf:       07 00 00 00 54          -                           ....T
KBuf:       ??                      -                           .
--------------------------------------------------------------------
<In> 0199   Opcode : 0000   Crs ID : 0xffffffff  Db Length : 00001   Keynum : fe   Clnt ID : 00 00 00 00 00 00 00 00 00 00 85 00 50 55 00 00
DBuf:       4e 4f 54 53 48 4f 57 4e - 00                        NOTSHOWN.
KBuf:       5c 5c 4e 54 34 53 52 56 - 2d 4a 55 44 49 54 5c 43   \\NT4SRV-JUDIT\C
            24 5c 64 65 6d 6f 64 61 - 74 61 5c 74 75 69 74 69   $\demodata\tuiti
 
<Out>0199   Status : 0000   Crs ID : 0x00000002  Db Length : 00001   Keynum : fe   Clnt ID : 00 00 00 00 00 00 00 00 00 00 85 00 50 55 00 00
DBuf:       4e 4f 54 53 48 4f 57 4e - 00                        NOTSHOWN.
KBuf:       5c 5c 4e 54 34 53 52 56 - 2d 4a 55 44 49 54 5c 43   \\NT4SRV-JUDIT\C
            24 5c 64 65 6d 6f 64 61 - 74 61 5c 74 75 69 74 69   $\demodata\tuiti
--------------------------------------------------------------------
<In> 0200   Opcode : 0015   Crs ID : 0x00000002  Db Length : 00028   Keynum : fe   Clnt ID : 00 00 00 00 00 00 00 00 00 00 85 00 50 55 00 00
DBuf:       00 00 00 00 00 01 07 00 - 00 00 00 00 00 00 00 03   ................
            c3 3f 00 10 00 00 00 00 - b4 fe 36 03               .?........6.
KBuf:       00 00 00 00 1c 00 00 00 - da fe 36 03 00 00 00 00   ..........6.....
            00 01 07 00 00 00 00 00 - 00 00 00 03 c3 3f 00 10   .............?..
 
<Out>0200   Status : 0000   Crs ID : 0x00000002  Db Length : 00007   Keynum : fe   Clnt ID : 00 00 00 00 00 00 00 00 00 00 85 00 50 55 00 00
DBuf:       03 00 0e 00 04 05 01    -                           .......
KBuf:       00 00 00 00 07 00 00 00 - da fe 36 03 03 00 0e 00   ..........6.....
            04 05 01 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
--------------------------------------------------------------------
<In> 0201   Opcode : 0015   Crs ID : 0x00000002  Db Length : 33455   Keynum : ff   Clnt ID : 00 00 00 00 00 00 00 00 00 00 85 00 50 55 00 00
DBuf:       2b 00 cb ff ff ff ff ff - ff ff ff ff ff ff ff 00   +...............
            00 0e 00 04 05 01 00 00 - 00 00 00 00 00 00 00 00   ................
            00 00 00 00 00 00 00 00 - 00 00 00 14 4e 54 34 53   ............NT4S
            52 56 2d 4a 55 44 49 54 - 5c 75 6e 6b 6e 6f 77 6e   RV-JUDIT\unknown
KBuf:       00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
            00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
<Out>0201   Status : 0000   Crs ID : 0x00000002  Db Length : 00064   Keynum : ff   Clnt ID : 00 00 00 00 00 00 00 00 00 00 85 00 50 55 00 00
DBuf:       0e 00 00 10 03 70 08 00 - 00 00 01 12 00 00 00 00   .....p..........
            01 00 04 00 00 01 08 00 - 00 00 0f 00 00 00 00 00   ................
            05 00 05 00 03 05 04 00 - 00 00 0a 00 00 00 01 00   ................
            0a 00 01 00 03 01 02 00 - 00 00 00 00 00 00 02 00   ................
KBuf:       00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
            00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
--------------------------------------------------------------------
<In> 0202   Opcode : 0065   Crs ID : 0x00000002  Db Length : 00268   Keynum : 00   Clnt ID : 00 00 00 00 00 00 00 00 00 00 85 00 50 55 00 00
DBuf:       45 78 53 74 01 00 00 00 - 00 00 00 00 01 00 00 00   ExSt............
            00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
            00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
            00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
KBuf:       ??                      -                           .
<Out>0202   Status : 0000   Crs ID : 0x00000002  Db Length : 00035   Keynum : 00   Clnt ID : 00 00 00 00 00 00 00 00 00 00 85 00 50 55 00 00
DBuf:       01 00 00 00 01 00 00 00 - 17 00 00 00 43 3a 5c 44   ............C:\D
            45 4d 4f 44 41 54 41 5c - 54 55 49 54 49 4f 4e 2e   EMODATA\TUITION.
            4d 4b 44                -                           MKD
KBuf:       ??                      -                           .
--------------------------------------------------------------------
<In> 0203   Opcode : 0065   Crs ID : 0x00000002  Db Length : 00008   Keynum : 00   Clnt ID : 00 00 00 00 00 00 00 00 00 00 85 00 50 55 00 00
DBuf:       45 78 53 74 02 00 00 00 -                           ExSt....
KBuf:       ??                      -                           .
 
<Out>0203   Status : 0000   Crs ID : 0x00000002  Db Length : 00008   Keynum : 00   Clnt ID : 00 00 00 00 00 00 00 00 00 00 85 00 50 55 00 00
DBuf:       00 00 01 00 00 00 07 00 -                           ........
KBuf:       ??                      -                           .
--------------------------------------------------------------------
<In> 0204   Opcode : 0001   Crs ID : 0x00000002  Db Length : 00000   Keynum : 00   Clnt ID : 00 00 00 00 00 00 00 00 00 00 85 00 50 55 00 00
DBuf:       ??                      -                           .
KBuf:       ??                      -                           .
 
<Out>0204   Status : 0000   Crs ID : 0x00000000  Db Length : 00000   Keynum : 00   Clnt ID : 00 00 00 00 00 00 00 00 00 00 85 00 50 55 00 00
DBuf:       ??                      -                           .
KBuf:       ??                      -                           .
 
---------------------------------------------------------------------
<In> 0205   Opcode : 0028   Crs ID : 0xffbc000c  Db Length : 00000   Keynum : 00   Clnt ID : 00 00 00 00 00 00 00 00 00 00 85 00 50 55 00 00
DBuf:                               -
KBuf:                               -
 
<Out>0205   Status : 0000   Crs ID : 0xffbc000c  Db Length : 00000   Keynum : 00   Clnt ID : 00 00 00 00 00 00 00 00 00 00 85 00 50 55 00 00
DBuf:                               -
KBuf:                               -
--------------------------------------------------------------------
オペレーションごとに、MicroKernel に渡した値と MicroKernel から返された値を示しています。入力値は <In> で表され、出力値は <Out> で表されています。それぞれの後ろに、オペレーションが処理された順序を示す番号が続くので、<Out> 0016 は <In> 0016 の結果となります。Opcode フィールドは、実行されたオペレーション コードを示します。Status フィールドは、返されたステータス コードを示します。
Crs ID は、MicroKernel が要求に割り当てたカーソル ID、つまり、ハンドルです。この情報は、複数のクライアントをサポートしたり、複数のカーソルで単一のクライアントをサポートするアプリケーションのデバッグに有効な場合があります。
Db Length は、データ バッファー長を反映します。Keynum は、キー番号を反映します。Clnt ID は、BTRVID 関数と BTRCALLID 関数で使用されるクライアント ID パラメーターを反映します。DBuf は、データ バッファーの内容を反映します。KBuf は、キー バッファーの内容を反映します。トレース ファイルは、MicroKernel の設定に応じて、データ バッファーおよびキー バッファーの内容を切り詰めます。
メモ:パフォーマンスの低下を回避するために、[トレース オペレーションの実行]設定を短時間だけオンに切り替えて、どのオペレーションが MicroKernel で処理されているかを判断します。
クライアント/サーバー環境における間接的な Chunk オペレーション
Get Direct/Chunk(23)オペレーションを行おうとすると、アプリケーションはステータス コード 62 を受け取ることがあります。アプリケーションでは間接ランダム ディスクリプター オプション(サブファンクション 0x80000001)を指定しているのに、トレースを有効にすると、実際には MicroKernel が直接ランダム ディスクリプター オプション(サブファンクション 0x80000000)を受信していることがわかります。
間接チャンク オプションでは、アプリケーションはデータの取得後、そのデータが Btrieve 呼び出しの実際のデータ バッファー パラメーターに返されるのではなく、データを格納したいアプリケーションのメモリ ブロックに返されるよう、データ アドレスへのポインターを指定することができます。しかし、MicroKernel がアプリケーションのメモリへの直接アクセスを行わない環境でアプリケーションが動作しているので、Btrieve クライアント リクエスターは間接チャンク要求を直接チャンク要求に変換してから、その要求を MicroKernel に送ります。
すべてのアプリケーションは、アプリケーションと MicroKernel の間の通信に必ずプロセス間通信(IPC)を使用します。IPC が要求されるため、MicroKernel はアプリケーションのメモリにアクセスしないので、クライアント リクエスターは単一の連続メモリ ブロックを割り当て、そのメモリ ブロックを指すようにすべてのデータ ポインターを調整します。MicroKernel から戻ると、リクエスターは間接オプションに対応する形式にデータ バッファーを変換し、返されたデータ チャンクをアプリケーションのメモリ ブロック内の指定された間接アドレスへ移動します。
エンジンのシャットダウンと接続のリセット
Windows 98/ME または Windows NT 以降をターゲットにするマルチスレッド コンソール アプリケーションを開発している場合は、起こり得る Ctrl-C キーストロークを処理するようにコントロール ハンドラー ルーチンを設定する必要があります。このコントロール ハンドラー ルーチンでは、Reset(28)オペレーションまたは Stop(25)オペレーションのいずれかを発行することによって、すべての Btrieve クライアントをクリーンアップする必要があります。クリーンアップ プロセスは、アプリケーションが Ctrl-C イベントをオペレーティング システムに渡す前に終了しなければなりません。
システムがスレッドを終了したときにアプリケーションがアクティブのままになっている場合、MicroKernel はアプリケーションとの接続をクリーンアップできず、さらに多くのシステム リソースを強制的に割り当てます。このため、パフォーマンスの低下が発生し、エンジンのシャットダウンに必要な時間が大幅に増えます。コントロール ハンドラー ルーチンの詳細については、Microsoft のドキュメントを参照してください。
ファイル内の無駄な領域の削減
MicroKernel は、必要に応じてディスク領域を割り当てます。アプリケーションが新しいレコードを挿入するときにファイル内に十分なスペースがない場合、MicroKernel は追加のデータ ページとインデックス ページをファイルに自動的に割り当てます。割り当てられた各ページのサイズは、ファイルが作成されたときのページ サイズと同じです。MicroKernel は、新しいファイル サイズを反映するためにディレクトリ構造も更新します。
MicroKernel がファイルにスペースを割り当てると、そのスペースはファイルが存在する間割り当てられたままになります。
多数のレコードが削除されたファイルが必要とするスペースを減らすために、以下のように Maintenance ユーティリティを使用します。
1 元のファイルと同じ特性を持つ新しいファイルを作成します。
対話型の Maintenance ユーティリティでは、[オプション]メニューの[情報エディターの表示]を選択し、[ファイル情報エディター]で元のファイルの[情報のロード]を行い、[ファイルの作成]を行います。コマンド ライン ベースの Maintenance ユーティリティでは、コマンドは CLONE です。
2 以下の方法のうちの 1 つを使用して新しいファイルにレコードを挿入します。
元のファイルからレコードを読み取り、それらのレコードを新しいファイルに挿入する、小さなアプリケーションを作成します。
コマンド ラインベースの Maintenance ユーティリティでは、SAVE コマンドを使用し、次に LOAD コマンドを使用します。別の方法として、COPY コマンドを使用することができます。
対話型の Maintenance ユーティリティでは、[データ]メニューから[保存]コマンドを使用し、次に[ロード]コマンドを使用します。別の方法として、[データ]メニューから[コピー]コマンドを使用できます。
3 新しいファイルの名前を変更し、次にディスクからオリジナル ファイルを削除します。