我有以下代码在我的开发环境中正常工作,但是当代码移动到生产服务器时,它会给出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;
}
}
答案 0 :(得分: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
。