0

私の開発環境では正常に動作している次のコードがありますが、コードを本番サーバーに移動すると、Oracle に「ヒープ整合性エラー」が発生します。これをデバッグする方法とその理由を教えてください。

if (TagValue[TagTable[TagLoc].Ptr2ValueTable].repetitionOutValue.length==-1)
{
                TagValue[TagTable[TagLoc].Ptr2ValueTable].repetitionOutValue.value
     = (char*) malloc (*CurLen+1)   ;
}
else
{
             more_val2 = (char*) realloc (TagValue[TagTable[TagLoc].Ptr2ValueTable].repetitionOutValue.value
             , (strlen(TagValue[TagTable[TagLoc].Ptr2ValueTable].repetitionOutValue.value)+(*CurLen)) * sizeof(char));

      if (more_val2!=NULL) 
      {
      TagValue[TagTable[TagLoc].Ptr2ValueTable].repetitionOutValue.value=more_val2;
      } 
  }
4

1 に答える 1

1

Valgrindでプログラムをチェックしてください。

オラクルがこの実装定義のステータスについて言うように:

コード 条件 Oracle エラー
82111 ヒープ一貫性エラー SQL-02111
  • ヒープ一貫性エラー

  • この内部エラーは通常、メモリ関連のエラーを示します。

  • 無効なポインタ配列境界違反など、メモリ関連のエラーがないかプログラムをチェックします。

トー; これが巨大なコードであり、チェックを通過したことがない場合 - 私はあなたが先のタスクをうらやましく思いません.

ここでのheapは、動的変数用に予約されたメモリ領域です。

過剰なヒープ検証も、 によって有効になるランタイム オプションORAHCHFです。設定されている場合、プリコンパイラがメモリを動的に割り当てたり解放したりするたびにヒープの一貫性をチェックするように Oracle ランタイム ライブラリに指示します。

事前に設定する必要がCONNECTあり、一度設定するとクリアできません。デフォルトは 0/オフです。

また、malloc に対して冗長なキャストを行います。おそらく、開発環境と本番環境が影響する他の場所にキャストするなどです。つまり、32 対 64 ビットです。

  • mallocあなたにmalloc CurLen+1
  • あなたreallocは余分なものを追加しません1'\0'?)。

これが問題であるかどうかは、repetitionOut.value後で何をするかによって異なります。

strlen()終了をカウントしません\0

于 2012-04-19T18:27:28.750 に答える