Solaris Sparc上的gcc 4.9堆栈展开问题

时间:2019-01-10 20:10:53

标签: gcc stack solaris sparc

我们在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;
    }
    }

0 个答案:

没有答案