デバッグ・メモリー・マネージャー

デバッグ・メモリー・マネージャーは、主に、アプリケーションによるヒープの不正使用の検出に使用されます。デバッグ・メモリー・マネージャーは、パフォーマンス用に最適化されておらず、アプリケーションのパフォーマンスに悪影響を及ぼす場合もあります。ただし、ヒープの不正使用の判別には役立ちます。

メモリー管理エラーは、割り振られたバッファーの終端を超えて書き込みを行うことによって起こることがあります。ずっと後に、上書きされた (通常は他に割り振られた) メモリーが参照され、そのメモリーに予想されたデータが含まれていなくなるまで、症状は現れません。

デバッグ・メモリー・マネージャーを使用すると、メモリーの上書き、メモリーのオーバーリード、重複解放、および解放済みメモリーの再利用を検出することができます。デバッグ・メモリー・マネージャーによって検出されるメモリー問題は、次の 2 つのうちいずれかになります。

  • 不正使用が発生した時点で問題が検出された場合、MCH 例外メッセージ (通常は、MCH0601、MCH3402、または MCH6801) が生成されます。この場合、通常、エラー・メッセージが表示された後、アプリケーションは停止します。
  • 不正使用が既に発生した後になるまで問題が検出されなかった場合、C2M1212 メッセージが生成されます。この場合、通常、メッセージが表示されても、アプリケーションは停止しません。
デバッグ・メモリー・マネージャーは、次の 2 つの方法で、メモリーの上書きおよびメモリーのオーバーリードを検出します。
  • 最初の方法として、デバッグ・メモリー・マネージャーは、制限付きアクセス・メモリー・ページを使用します。制限付きアクセス・メモリー・ページは、各割り振りの前後に置かれます。各メモリー・ブロックは、16 バイト境界に位置合わせされ、できるだけページ終端に近い位置に置かれます。メモリー保護が可能なのはページ境界上のみなので、この位置合わせを行うことにより、メモリー上書きおよびメモリー・オーバーリードの最適な検出が行えるようになります。制限付きアクセス・メモリー・ページの 1 つに対して読み取りまたは書き込みが行われると、即時に MCH 例外が出されることになります。
  • 2 番目の方法として、デバッグ・メモリー・マネージャーは、各割り振りの前後に埋め込みバイトを使用します。各割り振りの直前のいくつかのバイトは、割り振り時に、事前設定されたバイト・パターンに初期化されます。割り振りサイズを 16 バイトの倍数に丸めるために必要な、割り振りの直後の埋め込みバイトはすべて、割り振り時に、事前設定済みのバイト・パターンに初期化されます。割り振りが解放された場合、すべての埋め込みバイトは検査され、予想された事前設定済みのバイト・パターンを含んだままであることが確認されます。埋め込みバイトのいずれかが変更されている場合、デバッグ・メモリー・マネージャーは C2M1212 メッセージと理由コード X'80000000' を生成して、この事実を示します。

割り振り

各割り振り要求には、大量の追加メモリーが必要です。追加メモリーは、以下のために必要です。

  • 割り振りの前のメモリー・ページ (単一レベル・ストア・バージョンのみ)
  • 割り振りの後のメモリー・ページ
  • 各割り振りのヘッダー
  • 各メモリー・ブロックの 16 バイト境界への配置
各割り振りのヘッダー・サイズは、16 バイトです。各ブロックは、16 バイト境界に位置合わせされている必要があります。単一レベル・ストア・バージョンでのサイズ n の割り振りに必要なメモリーの総量は、次のようになります。
size = ROUND((PAGESIZE * 2) + n + 16, PAGESIZE)

例えば、4096 バイトのページ・サイズを使用してサイズ 37 を割り振ると、ROUND(8192 + 37 + 16, 4096) のサイズ、すなわち 12,288 バイトが必要になります。

テラスペース・バージョンでのサイズ n の割り振りに必要なメモリーの総量は、次のようになります。

size = ROUND(PAGESIZE + n + 16, PAGESIZE)

例えば、4096 バイトのページ・サイズを使用してサイズ 37 を割り振ると、ROUND(4096 + 37 + 16, 4096) のサイズ、すなわち 8,192 バイトが必要になります。

割り振り解除

free 操作によって割り振り解除されたメモリー・ブロックは、システムに戻されます。ページ保護属性は、そのメモリー・ブロックに対する後続の読み取りまたは書き込みアクセスはすべて MCH 例外を生成するように設定されています。

再割り振り

いずれの場合も、次の処理が発生します。
  • 要求されたサイズの新規ブロックが割り振られます。
  • データが元のブロックから新しいブロックに移動されます。
  • 元のブロックが free 操作によって戻されます。
  • 新しいブロックが呼び出し元に戻されます。

デバッグ・メモリー・マネージャーの使用可能化

デバッグ・メモリー・マネージャーは、デフォルトでは使用可能になりませんが、以下の環境変数を設定することによって使用可能になり構成されます。
QIBM_MALLOC_TYPE=DEBUG
QIBM_MALLOC_DEBUG_OPTIONS=options

デフォルトの設定値を使用してデバッグ・メモリー・マネージャーを使用可能にするには、QIBM_MALLOC_TYPE=DEBUG を指定する必要があります。ユーザー指定の構成オプションを使用してデバッグ・メモリー・マネージャーを使用可能にするには、QIBM_MALLOC_DEBUG_OPTIONS=options を設定します。ここで、options は、1 つ以上の構成オプションをブランクで区切ったリストです。

QIBM_MALLOC_TYPE=DEBUG 環境変数が指定されているときに _C_Quickpool_Init() 関数が呼び出された場合は、環境変数の設定が _C_Quickpool_Init() 関数より優先され、_C_Quickpool_Init() 関数は、代替ヒープ・マネージャーが使用可能にされていることを示す値 -1 を戻します。

構成オプション

以下の構成オプションを使用できます。

MALLOC_INIT:N

このオプションを使用して、割り振られたメモリーの各バイトを指定値に初期化することを指定できます。値 N は、0 から 255 までの範囲の整数を表します。

このオプションは、デフォルトでは使用可能になりません。

FREE_INIT:N

このオプションを使用して、解放されたメモリーの各バイトを指定値に初期化することを指定できます。値 N は、0 から 255 までの範囲の整数を表します。

このオプションは、デフォルトでは使用可能になりません。

任意の数のオプションを任意の順序で指定することができます。ブランクが、構成オプションを区切るために有効な唯一の区切り文字です。各構成オプションは、1 回だけ指定するようにしてください。1 つの構成オプションが複数回指定された場合は、最後のインスタンスのみが適用されることになります。構成オプションが無効な値で指定された場合、その構成オプションは無視されます。

ADDENVVAR ENVVAR(QIBM_MALLOC_DEBUG_OPTIONS) LEVEL(*JOB) REPLACE(*YES) VALUE('')

ADDENVVAR ENVVAR(QIBM_MALLOC_DEBUG_OPTIONS) LEVEL(*JOB) REPLACE(*YES) 
VALUE('MALLOC_INIT:255 FREE_INIT:0')

1 番目の例は、デフォルトの構成値を示します。2 番目の例は、指定されているすべてのオプションを示します。

関連機能

デバッグ・メモリー・マネージャー用の構成オプションを有効にするために、または指定するために使用可能な関数はありません。構成オプションを有効にする、または指定するには、環境変数サポートを使用します。

注:
  1. デバッグ・メモリー・マネージャーは、一度に 1 つのアプリケーション、あるいは小さなアプリケーション・グループをデバッグする場合に使用します。

    デバッグ・メモリー・マネージャーは、常時、持続的に使用したり、システム全体で使用したりするのには適していません。デバッグ・メモリー・マネージャーは、デバッグするアプリケーションへのパフォーマンスの影響を最小限に押さえるように設計されていますが、システム全体で使用すると、システム全体のスループットに重大な悪影響を及ぼす場合があります。システム補助記憶域プール (ASP) の使用超過などの重大なシステムの問題を引き起こすことがあります。

  2. デバッグ・メモリー・マネージャーは、デフォルト・メモリー・マネージャーに比べてはるかに多くのメモリーを消費します。その結果、デバッグ・メモリー・マネージャーは、デバッグする状態によっては使用するのが適切ではない場合があります。

    割り振りごとに 2 メモリー・ページ以上の追加メモリーを必要とするので、小さな割り振り要求を数多く出すアプリケーションでは、メモリー使用量が急激に増加します。これらのプログラムでは、メモリー不足によってメモリー割り振り要求が拒否され、別の障害が発生する場合があります。この障害は、必ずしもデバッグ中のアプリケーションで起こるエラーとは限らず、またデバッグ・メモリー・マネージャーで発生するエラーでもありません。

    単一レベル・ストア・バージョンには、割り振り済みヒープ・ストレージの最大量について、4 GB をわずかに下回る制限があります。デバッグ・メモリー・マネージャーは、割り振りごとに少なくとも 3 ページを割り振ります。これにより、350,000 より少ない未解決のヒープ割り振りが可能になります (4096 バイトのページ・サイズを使用した場合)。

  3. デバッグ・メモリー・マネージャーの単一レベル・ストア・バージョンは、各割り振りを別個の 16 MB セグメント内で行います。このため、システムが一時アドレスをより頻繁に使用することになる場合があります。

関連情報