2012-04-19 86 views
0

我有我的開發環境中正常工作的以下代碼,但是當代碼移到生產服務器時,它會給oracle提供「堆一致性錯誤」。 你能讓我知道如何調試這個和原因嗎?C/Pro *堆中的堆一致性錯誤C

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; 
     } 
    } 
+3

向我們展示代碼! – Nick 2012-04-19 15:36:14

+0

謝謝你的回覆。請注意每個變量初始化 – QMG 2012-04-19 15:40:21

+1

對不起,但我不知道你的代碼正在嘗試做什麼... – Nick 2012-04-19 16:17:10

回答

1

用Valgrind檢查程序。

作爲oracle說此實現定義狀態:

 
Code Condition    Oracle Error 
82111 heap consistency error SQL-02111 
  • 堆一致性錯誤

  • 此內部錯誤通常指示一個存儲器相關的錯誤。

  • 檢查程序的內存相關的錯誤,如無效指針數組邊界違規

壽;如果這是一個龐大的代碼,從來沒有通過任何檢查 - 我不羨慕你的任務。

,這裏是一個爲動態變量保留的內存區域。

過量堆驗證也是由ORAHCHF啓用的運行時選項。如果set指示Oracle運行時庫在每次預編譯器動態分配或釋放內存時檢查堆的一致性。

必須在CONNECT之前設置,並且一旦設置,就不能清除。默認爲0 /關閉。

您還可以在malloc上執行冗餘轉換。也許你在其他地方演員等,在發展與生產環境有關的地方。即32對64位。

  • malloc你的malloc CurLen + 1
  • 在您realloc你不添加額外的1(用於'\0'?)。

如果這是一個問題取決於你對repetitionOut.value做了什麼後。

strlen()不包括終止\0

+0

謝謝你符文的回覆。我添加了+1,但仍然出現一致性錯誤。當我運行程序的單個實例時,它工作正常。但是當我運行4個實例時,這個一致性問題引發了 – QMG 2012-04-20 09:51:49

+0

什麼環境? Linux + GCC還是? – Morpfh 2012-04-20 14:08:33