Мы столкнулись с некоторой проблемой разматывания стека в 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;
}
}