我们的嵌入式系统基于enea制造的hw / sw平台。在最近更新平台后,我们发现全局变量上的一些操作会使系统崩溃。
例如,我们有一个包含一些数据的全局地图结构。我们可以插入/迭代一次或两次地图,然后地图中元素的地址突然变为一些禁止的地址,如0x0或0x1d,系统崩溃。
平台更新之前/之后唯一不同的是: 1)sw part:这是一个c ++软件,我们将编译器从diab cc更改为gcc。 2)hw部分:我们有一块新板,但cpu仍然是powerpc405s。
我尝试了一切可能的方法,但仍然无法弄清楚原因。有什么想法吗?
答案 0 :(得分:2)
全局变量的已知问题是初始化顺序。通常不定义此订单。因此,如果一个全局的ctor尝试使用另一个全局,您可能会看到崩溃。在您的情况下,问题可能是GCC决定稍后在您使用它之后初始化地图。
快速解决方案可以用单身替换全局:
MyClass& MyClass::instance() {
static MyClass singleton;
return singleton;
}
singleton
是在函数返回之前创建的,因此肯定在它被使用之前创建。
答案 1 :(得分:0)
看起来你有一个内存不足的情况,或者一个缺陷内存分配器。当您使用stl容器时,可以将allocator作为模板参数更改为malloc_alloc,并使用类似dmalloc的lib来查看内存容量是否出错(请参阅http://www.sgi.com/tech/stl/Allocators.html)。您也可以尝试在linux下编译软件并使用valgrind来查找内存问题。
答案 2 :(得分:0)
一些想法: