C2M1212 メッセージ

C2M1212 メッセージは、メモリーの破損およびその他の問題の原因となる可能性がある、あるタイプのメモリー問題を示します。 メモリーの破損は、アプリケーション・コード内またはオペレーティング・システム・コード内で発生する可能性があります。 このメッセージは、診断メッセージにすぎませんが、実際の問題の標識の場合があります。 C2M1212 メッセージが、他の問題のソースである場合と、そうでない場合があります。 可能な場合は、メモリー問題をクリーンアップしてください。

C2M1212 メッセージが生成される場合、free() 関数に渡されたポインターの 16 進値がメッセージ記述の一部として組み込まれています。 この 16 進値は、問題の発生元への手掛かりを与えてくれます。 malloc() 関数は、16 進数 0 で終了するポインターのみを戻します。 16 進数 0 で終わらないポインターはいずれも、malloc() 関数によって予約されたストレージを指すように設定されていないか、または malloc() 関数によって予約されているストレージを指すように設定されているため、変更されませんでした。 ポインターが 16 進数 0 で終了する場合、C2M1212 メッセージの原因が不確定であり、free() を呼び出すプログラム・コードを検査する必要があります。

ほとんどの場合、単一レベル・ストア・ヒープ・メモリー・マネージャーからの C2M1212 メッセージの前に、MCH6902 メッセージが出されます。 MCH6902 メッセージは、問題が何であるかを示すエラー・コードを持っています。 最も一般的なエラー・コードは 2 です。これは、現在割り振りされていないメモリーが解放されようとしていることを示します。 このエラー・コードは、次のいずれかを意味しています。
  • 割り振りされていないメモリーが解放されようとしている。
  • メモリーが、再度、解放されようとしている。

場合によっては、メモリー・リークが原因で単一レベル・ストア・ヒープがフラグメント化され、その結果ヒープ制御セグメントがいっぱいになり、割り振り解除ができなくなってしまっている場合があります。 この問題は、MCH6906 メッセージによって示されます。 この場合、唯一の解決策は、アプリケーションをデバッグしてメモリー・リークを修正することです。

スタック・トレースバック ( スタック・トレースバックを参照) を使用して、問題の原因となっているコードを見つけることができます。 コードが検出された後、難しい部分は、ヒープ・ストレージへのポインターでの問題は何かを判別することです。 考えられるいくつかの原因は、次のとおりです。
  1. ポインターが初期化されておらず、予期しない値を含んでいる。 C2M1212 メッセージは、ポインターの 16 進値をダンプします。
  2. ポインターは、malloc() から取得されたものではない。 このポインターは、自動 (ローカル) 変数または静的 (グローバル) 変数へのポインターであり、malloc() からのヒープ・ストレージへのポインターではないことが考えられます。
  3. ポインターは、malloc() から戻された後に変更された。 例えば、malloc() から戻されたポインターが、若干増分された後に free() に渡された場合、このポインターは無効となり、C2M1212 メッセージが出されます。
  4. ポインターは、再度、free() に渡されようとしている。 free() がポインターで呼び出されると、そのポインターによって指されたスペースは割り振り解除され、free() が再び呼び出された場合は、C2M1212 メッセージが出されます。
  5. ヒープ割り振りを追跡するためにヒープ・マネージャーが保守するヒープ構造が破壊されている。 この場合、ポインターが有効であっても、ヒープ・マネージャーはそれを判別できず、その結果として C2M1212 メッセージが出されます。 ヒープ構造が破壊された場合、通常、ヒープ破壊が発生したことを示す C2M1211 メッセージが、ジョブ・ログに少なくとも 1 つ表示されます。
  6. デバッグ・メモリー・マネージャーが使用中であり、C2M1212 メッセージ上の理由コードが X'8000000000' である場合は、指定された割り振りに関して埋め込みバイトが上書きされています。 詳しくは、 デバッグ・メモリー・マネージャー を参照してください。