查找导致细分错误

时间:2020-10-30 13:16:01

标签: c++ segmentation-fault find

我有一个用于库插入的共享库,它带有一个unordered_map。 在执行应用程序时(拦截特定调用时)将填充并查询unordered_map。

如果我尝试在库的构造函数中找到一个元素,则会生成分段错误。

以下是导致分段错误的构造函数的代码:

void __attribute__((constructor)) init(void) { 
    void * address =  __builtin_extract_return_addr(__builtin_return_address(0));
    printf ("Size: %i\n", stats._regions.size()); // works fine
    auto regionIt = stats._regions.find(address);
    printf ("Never reached\n");
}

统计信息在标头中声明,如下所示:

class Stats {
  public
    std::unordered_map<void *, RegionInfo> _regions;
}

如前所述,如果我在侦听特定调用时进行查找(不在构造函数中),则可以正常工作。

1 个答案:

答案 0 :(得分:1)

以下是导致分段错误的构造函数的代码:

您没有显示stats全局本身是如何声明的,并且没有显示您的代码是无用的(另请参见MCVE)。

但这几乎可以肯定是静态初始化顺序惨败的一个实例。

如何测试SIOF?并在这种情况下进行修复

修复SIOF的常用方法:与其将stats声明为全局变量,而不必将其声明为函数静态变量并返回对其的引用,这样可以确保在访问之前将其初始化:

Stats& get_stats()
{
  static Stats stats;
  return stats;
}

您的构造函数将如下所示:

void __attribute__((constructor)) init(void) { 
  Stats& stats = get_stats();
  // rest as before
}

如果这可以解决崩溃问题,您将知道它是SIOF的一个实例。