Проблема разматывания стека в gcc 4.9 в Solaris Sparc - PullRequest
0 голосов
/ 10 января 2019

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