Btrieve アプリケーションのデバッグ
この章では、Btrieve アプリケーションのデバッグに役立つと思われる情報を示します。以下の項目が含まれています。
トレース ファイル
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 新しいファイルの名前を変更し、次にディスクからオリジナル ファイルを削除します。