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所说,对于这个实现定义的状态:

代码条件 Oracle 错误
82111 堆一致性错误 SQL-02111
  • 堆一致性错误

  • 此内部错误通常表示与内存相关的错误。

  • 检查程序是否存在与内存相关的错误,例如无效指针数组边界违规

寿; 如果这是一个从未通过任何检查的巨大代码 - 我不羡慕你前面的任务。

这里的是为动态变量保留的内存区域。

过多的堆验证也是ORAHCHF. 如果设置告诉 Oracle 运行时库在每次预编译器动态分配或释放内存时检查堆的一致性。

必须在设置之前CONNECT设置,一旦设置,无法清除。默认为 0/关闭。

您还对 malloc 进行了冗余转换。也许您在开发与生产环境有影响的其他地方进行投射等。即 32 与 64 位。

  • malloc你 malloc CurLen+1
  • 在您的realloc身上,您不要添加额外的1(对于'\0'?)。

如果这是一个问题,取决于您repetitionOut.value之后的处理方式。

strlen()不计算终止\0

于 2012-04-19T18:27:28.750 回答