我有一个用于库插入的共享库,它带有一个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;
}
如前所述,如果我在侦听特定调用时进行查找(不在构造函数中),则可以正常工作。
答案 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的一个实例。