Глобальная переменная не стабильна после изменения платформы - PullRequest
0 голосов
/ 26 мая 2010

Наша встраиваемая система построена на платформе hw / sw, разработанной Enea. После недавнего обновления платформы мы обнаружили, что некоторые операции над глобальной переменной продолжают сбой системы.

Например, у нас есть глобальная структура карты, содержащая некоторые данные. Мы можем вставить / перебрать карту один или два раза, затем адрес элементов на карте внезапно изменился на некоторые запрещенные адреса, такие как 0x0 или 0x1d, система просто рухнула

Единственное отличие до / после обновления платформы: 1) sw part: это программное обеспечение на c ++, и мы изменили компилятор с diab cc на gcc. 2) hw part: у нас новая плата, но процессор все еще powerpc405s.

Я пытался всеми возможными способами, но до сих пор не могу понять причину. Есть мысли?

Ответы [ 3 ]

2 голосов
/ 26 мая 2010

Известной проблемой с глобальными переменными является порядок инициализации. Этот порядок обычно не определяется. В результате вы можете увидеть сбои, если ctor одного глобального пытается использовать другой глобальный. В вашем случае проблема может заключаться в том, что GCC решил инициализировать карту позже, после того места, где вы ее используете.

Быстрое решение может состоять в том, чтобы заменить глобальный синглтон:

MyClass& MyClass::instance() {
  static MyClass singleton;
  return singleton;
}

singleton создается перед возвратом функции и, следовательно, прежде чем ее использовать.

0 голосов
/ 26 мая 2010

Некоторая идея:

  • При изменении компилятора крестик макрос платформы или компилятор предопределенный макрос может измениться.
  • Соответствует ли драйвер новой платы использовать аппаратное обеспечение или иначе, был включено / обновлено в новом программного обеспечения. Процессор может быть таким же, но не для остальной части оборудования в ваша доска. (если он используется)
  • Проблема выделения памяти: (объем памяти системы не одинаков, переполнение стека / кучи)
  • Например, неинициализированные данные могут работать по-разному в двух разных компиляторах / платформах.
  • Использование неопределенного исходного кода поведения (реализация которого зависит от компилятора)
0 голосов
/ 26 мая 2010

Похоже, у вас нехватка памяти или дефект памяти. Когда вы используете контейнер stl, вы можете изменить распределитель в качестве параметра шаблона на malloc_alloc и использовать библиотеку типа dmalloc, чтобы увидеть, не работает ли хранилище памяти неправильно (см. http://www.sgi.com/tech/stl/Allocators.html).. Вы также можете попробовать скомпилировать программное обеспечение под linux. и используйте valgrind для поиска проблем с памятью.

...