Может ли аппаратный сбой (например, повреждение ОЗУ) проявиться как нерациональное, но последовательное поведение в программе на C ++?
Сегодня я стал свидетелем очень странного поведения в программе, над которой я работал в течение последнего года или около того. Он написан на C ++, и я использую Visual Studio 2010. Было два случая необъяснимого поведения.
Первый задействовал конструктор определенного класса. После того, как я сделал некоторые изменения в коде (в другом месте, не в конструкторе) и перестроил проект, объем памяти увеличился до максимума и заморозил мою ОС (аналогично проблема У меня был год назад, который был из-за оптимизаций, но на этот раз оптимизации были отключены). После отладки я понял, что точки останова не были доступны в конструкторе, а это означает, что код не создавался. Если бы я добавил пару переменных-членов в структуру где-то еще в коде, конструктор снова волшебным образом работал.
Второй экземпляр включал метод A, вызывающий метод B и передающий параметр. При отладке передаваемая переменная была допустимой строкой перед передачей в B. После этого в параметре B параметр был пустым. Перезапуск системы заставил все снова работать нормально.
Это заставило меня подумать, что может быть проблема с моей оперативной памятью — после перезапуска программа может работать в другой части памяти и, таким образом, не сталкиваться с проблемами. Машина, над которой я работаю, в прошлом испытывала несколько синих экранов, хотя и не регулярно. Запуск средства диагностики памяти Windows не выявил проблем, но я все еще с подозрением.
Легко обвинять окружающую среду, когда ты не знаешь, что происходит, но я действительно никогда не видел ничего подобного раньше. Я просто хотел спросить, имеет ли смысл работать со сбоями в работе оборудования, как эта.
Если вы подозреваете аппаратное обеспечение, попробуйте другой компьютер. Тем не менее, со всех времен, когда я действительно думал, что сбой ОЗУ был причиной сбоя или проблем компиляции, ни одна не была. Наиболее вероятные причины:
Нет, вы можете быть уверены, что проблема не в вашем оборудовании. В противном случае другие приложения будут иметь некорректное поведение.
Сбои оборудования, как правило, влияют на большинство вещей в системе, а не только на одно приложение. Если вы подозреваете, что есть проблема с вашей машиной, попробуйте запустить тест памяти — это также проверит поведение процессора (хотя вероятность того, что это повлияет только на некоторые программы, еще ниже).
Я действительно считаю, что ваше программное обеспечение страдает от «неопределенного поведения», а не от аппаратного сбоя … Вы либо пишете вне разрешенных областей, либо используете неинициализированные переменные, либо что-то еще в этом духе. Попробуйте упростить ваш код, и если вы можете сделать это 15-50 строк кода, напишите здесь.