我们在Solaris 10/11 Sparc上遇到了一些堆栈释放问题,仅在调试模式下构建代码(odbc驱动程序)时才发生。我们在调试模式下构建了gcc以进行调查,结果发现指令指针(ip)在eh_personality.cc(行481-504,下面复制的代码)中未命中任何调用站点条目。对于在抛出帧和捕获帧之间的堆栈帧,会发生这种情况。该部分代码下方的注释为:
//如果表中不存在ip,则调用终止。这是为了 //清除过程中的析构函数或编译器的库例程 //没想到会抛出。
但是看起来我们没有涉及任何将抛出的析构函数。有没有人对此案有任何见解(奇怪的是,发行版有效)?
eh_personality.cpp中的代码:
// Search the call-site table for the action associated with this IP.
while (p < info.action_table)
{
_Unwind_Ptr cs_start, cs_len, cs_lp;
_uleb128_t cs_action;
// Note that all call-site encodings are "absolute" displacements.
p = read_encoded_value (0, info.call_site_encoding, p, &cs_start);
p = read_encoded_value (0, info.call_site_encoding, p, &cs_len);
p = read_encoded_value (0, info.call_site_encoding, p, &cs_lp);
p = read_uleb128 (p, &cs_action);
// The table is sorted, so if we've passed the ip, stop.
if (ip < info.Start + cs_start)
p = info.action_table;
else if (ip < info.Start + cs_start + cs_len)
{
if (cs_lp)
landing_pad = info.LPStart + cs_lp;
if (cs_action)
action_record = info.action_table + cs_action - 1;
goto found_something;
}
}