平台更改后全局变量不稳定

时间:2010-05-26 05:41:21

标签: c++ memory ose

我们的嵌入式系统基于enea制造的hw / sw平台。在最近更新平台后,我们发现全局变量上的一些操作会使系统崩溃。

例如,我们有一个包含一些数据的全局地图结构。我们可以插入/迭代一次或两次地图,然后地图中元素的地址突然变为一些禁止的地址,如0x0或0x1d,系统崩溃。

平台更新之前/之后唯一不同的是: 1)sw part:这是一个c ++软件,我们将编译器从diab cc更改为gcc。 2)hw部分:我们有一块新板,但cpu仍然是powerpc405s。

我尝试了一切可能的方法,但仍然无法弄清楚原因。有什么想法吗?

3 个答案:

答案 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)

一些想法:

  • 通过更改编译器,交叉 平台宏或编译器 预定义的宏可能会有变化。
  • 新板的驱动程序是否 使用硬件,否则,一直 在新的包含/更新 软件。 CPU可能是相同的但是 不适用于其他硬件 你的董事会。 (如果使用的话)
  • 内存分配问题:(系统内存大小不一样,堆栈/堆溢出)
  • 例如,未初始化的数据可能在两个不同的编译器/平台中具有不同的行为。
  • 使用未定义的行为源代码(具有不同的实现,具体取决于编译器)