Visual Studio 2010 — C ++ и возможный сбой оборудования

Может ли аппаратный сбой (например, повреждение ОЗУ) проявиться как нерациональное, но последовательное поведение в программе на C ++?

Сегодня я стал свидетелем очень странного поведения в программе, над которой я работал в течение последнего года или около того. Он написан на C ++, и я использую Visual Studio 2010. Было два случая необъяснимого поведения.

Первый задействовал конструктор определенного класса. После того, как я сделал некоторые изменения в коде (в другом месте, не в конструкторе) и перестроил проект, объем памяти увеличился до максимума и заморозил мою ОС (аналогично проблема У меня был год назад, который был из-за оптимизаций, но на этот раз оптимизации были отключены). После отладки я понял, что точки останова не были доступны в конструкторе, а это означает, что код не создавался. Если бы я добавил пару переменных-членов в структуру где-то еще в коде, конструктор снова волшебным образом работал.

Второй экземпляр включал метод A, вызывающий метод B и передающий параметр. При отладке передаваемая переменная была допустимой строкой перед передачей в B. После этого в параметре B параметр был пустым. Перезапуск системы заставил все снова работать нормально.

Это заставило меня подумать, что может быть проблема с моей оперативной памятью — после перезапуска программа может работать в другой части памяти и, таким образом, не сталкиваться с проблемами. Машина, над которой я работаю, в прошлом испытывала несколько синих экранов, хотя и не регулярно. Запуск средства диагностики памяти Windows не выявил проблем, но я все еще с подозрением.

Легко обвинять окружающую среду, когда ты не знаешь, что происходит, но я действительно никогда не видел ничего подобного раньше. Я просто хотел спросить, имеет ли смысл работать со сбоями в работе оборудования, как эта.

2

Решение

Если вы подозреваете аппаратное обеспечение, попробуйте другой компьютер. Тем не менее, со всех времен, когда я действительно думал, что сбой ОЗУ был причиной сбоя или проблем компиляции, ни одна не была. Наиболее вероятные причины:

  • Неопределенное поведение не только для неинициализированных переменных, но и для путей к функциям, которые не заканчиваются в результате возврата. Вы должны использовать что-то вроде Lint.
  • Плохие скрипты компиляции или make-файлы. Вы думаете, что работаете с библиотекой версии X, но на самом деле вы ссылаетесь на какую-то другую версию Y, или, иногда, на ту же версию, но на другой не такой же файл, особенно с разными версиями Debug / Test / Release.
  • Разное поведение библиотек при оптимизации и неоптимизации.
  • Потоки. Проверьте ваш доступ для записи / чтения в каждом возможном сценарии. По возможности используйте надежную и проверенную стабильную библиотеку.
1

Другие решения

Нет, вы можете быть уверены, что проблема не в вашем оборудовании. В противном случае другие приложения будут иметь некорректное поведение.

0

Сбои оборудования, как правило, влияют на большинство вещей в системе, а не только на одно приложение. Если вы подозреваете, что есть проблема с вашей машиной, попробуйте запустить тест памяти — это также проверит поведение процессора (хотя вероятность того, что это повлияет только на некоторые программы, еще ниже).

Я действительно считаю, что ваше программное обеспечение страдает от «неопределенного поведения», а не от аппаратного сбоя … Вы либо пишете вне разрешенных областей, либо используете неинициализированные переменные, либо что-то еще в этом духе. Попробуйте упростить ваш код, и если вы можете сделать это 15-50 строк кода, напишите здесь.

0
По вопросам рекламы [email protected]