Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.87
Petrolion
24 / 24 / 7
Регистрация: 02.02.2016
Сообщений: 124
#1

Битовые утечки при записи данных на диск - C++

06.06.2016, 14:42. Просмотров 3267. Ответов 119
Метки нет (Все метки)

Доброго дня форумчане!
Сорри если оффтоп но... Пишу в консольке на C++ (MSVCE 2010) различные движки по расчетам и тут столкнулся с опасной проблемой.
При записи на диск искажаются данные на один бит, где то один раз на 109 - 1011 данных. Бит просто "теряется" (был 1 стал 0 или наоборот) , соответственно данные уже не верны, что приводит к нулю все проделанную работу.
Из исследованного:
Бит теряется при записи как в поток текстового значения переменных (типа fileout << a[i] << endl;)
Так и при записи в двоичном виде (типа fileout.write(reinterpret_cast<char*>(a),size*sizeof(a[0]));)
Замечено, что данные в памяти верные, т.к. были пойманы моменты при повторном выводе из того же массива все данные были записаны корректно.
Ошибка не зависит от винчестера на который данные были записаны (были записи на 3 различных винта, один из которых рейд массив).
Чаще всего теряется один из старших битов (типа 24-й бит в unsigned long или 24-й в unsigned long long). Других потерянных бит не замечено.
Термин "потерянный" возможно применяю в данном случае не верно. Т.к. заметно искажение только при его инвертировании. Соответственно если был сбой и он вместо 1 записал сбойную 1 - этого я не найду.
Система молчит про контроль целостности данных. Винт тоже. У винтов и рейда все показатели в порядке (блоки не сыпятся, SMART в порядке).

Сталкивался ли кто с подобным? В чем может быть проблема?

В ближайшем будущем хочу переустановить систему и MSVCE 2013. Но не уверен, что система виновата.
Кто что подскажет?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2016, 14:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Битовые утечки при записи данных на диск (C++):

Избежать утечки памяти при преобразовании строки в массив символов - C++ Builder
Всем привет! Как избежать утечки памяти в таком коде: char* ConvertString(String input) { char *output = new char; ...

Утечки памяти при использовании new/delete для двумерных массивов - C++
Добрый день. Суть в том, что есть несколько функций, получающих на вход и возвращающих двумерные массивы. Реализация передачи массивов...

Битовые операции с разными типа данных - C++
Здравствуйте. В голове возник такой странный вопрос, а мб и не странный. Возможны ли битовые операции с разными типа данных, например int...

Битовые операции, битовые поля. - C++
Здравствуйте! Еслть 4 диапазона чисел: 0-100, 0-100, 0-6000, 0-3. Сделать в виде битовых операций. Записать в unsigned int. Использовать...

Ошибка при записи данных в файл - C++
Для записи перменной типа string выделяю динамически массив из 64 элементов char,после записи данных освобождаю память,но почему-то при...

Ошибка при записи в файл данных из обьекта класса - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;fstream&gt; using namespace std; class Vector { public: double x; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
vxg
Модератор
3157 / 1959 / 218
Регистрация: 13.01.2012
Сообщений: 7,496
15.06.2016, 09:42 #76
Petrolion, 16 ч теста не выявили никаких ошибок. собирал gcc-4.5.2-tdm64-1
Вложения
Тип файла: rar System64.rar (1.12 Мб, 2 просмотров)
Petrolion
24 / 24 / 7
Регистрация: 02.02.2016
Сообщений: 124
15.06.2016, 11:40  [ТС] #77
Таки получилось загрузить Debian Live 8.5.0 повыкидывать из кода все лишнее и загрузить QT-Creator.
Малый размер ядра системы позволил увеличить объем массива до 13 гиг.
Уже несколько часов работы без ошибок.
Не верю своему счастью! (Эдак и веру на линукс поменять можно )
В отличии от винды с ядра на ядро задача не перепрыгивает. Но субъективно кажется что выделение того же объема памяти чуть медленнее. (Специально не замерял). Не замечено сильной фрагментации памяти. Винду иногда приходилось перегружать (например при свободной 13 гиг оперативы, не мог выделить даже 8 одним куском).
Погоняю прогу еще сутки на разных ядрах. Если ошибок не будет. Начну издеваться на виндой (апгрейд до 10, переустановка). Если вновь установленная винда опять заглючит, выбор для задачи очевиден. Поставлю второй системой линукс и буду переучиваться под него (я и так нуб в С++ под виндой)
Evg
Эксперт CАвтор FAQ
17633 / 5857 / 377
Регистрация: 30.03.2009
Сообщений: 16,154
Записей в блоге: 26
15.06.2016, 11:46 #78
Цитата Сообщение от Petrolion Посмотреть сообщение
Не верю своему счастью! (Эдак и веру на линукс поменять можно )
Классическая ошибка, когда делается неверный вывод. С вероятностью 99% отличие идёт не от того, что ты работаешь под линуксом, а от того, что ты использовал другой компилятор, который сгенерировал другой код. Вполне возможно, что gcc оказался более ущербным, чем vc и не смог задействовать какие-то более быстрые операции или учесть какие-то дополнительные особенности. Банально ты мог не подать опции оптимизаций

Мне в общем-то всё равно, но вместо того, чтобы предметно разобраться с ошибкой, ты пошёл по другому пути, хотя я несколько раз говорил о том, что надо делать. Точно так же ты мог собрать свою программу не под MSVC, а под Borland'ом и получить другой код, на котором ошибка бы не воспроизводилась. Либо вообще собрать под MSVC с другими опциями компилятора

Не по теме:

Вот так и рождаются мифы о том, что одна ОС лучше другой

Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
15.06.2016, 11:59 #79
Можете попробовать программу Prime95, есть и под linux и под win. Её тест стабильности достаточно неплохо проверяет систему. Причем у меня на gentoo она находила ошибку через несколько часов, в то время как на win могла сутками крутиться. Если она найдет ошибку, то проблема в железе ( в крайнем случае в микрокоде ), а не в ОС.

Кстати, к слову о микрокодах. Вполне возможно, что debian обновил микрокод при запуске и пофиксил какой либо баг.
Petrolion
24 / 24 / 7
Регистрация: 02.02.2016
Сообщений: 124
15.06.2016, 12:09  [ТС] #80
Цитата Сообщение от Evg Посмотреть сообщение
Либо вообще собрать под MSVC с другими опциями компилятора
пробовал другие опции и другой MSVC. Результат тот же на моей системе. Другой компилятор не пробовал. (Чуть позже QT виндовым попробую)
Не хочу обновляться до 10 винды, но ради эксперимента сделаю. И попробую все протестить (при тех же опциях компилятора). Резльтат обязательно выложу сюда. Если все нормально будет - снесу и чистую семерку поставлю. Моей винде уже года четыре. И за виндами замечено накопление багов с годами.
Не хочу создавать мифы. Всегда опираюсь на "опыт - сын ошибок трудных"

Добавлено через 1 минуту
Toshkarik,
Цитата Сообщение от Toshkarik Посмотреть сообщение
Вполне возможно, что debian обновил микрокод при запуске и пофиксил какой либо баг.
он такое может?!

Добавлено через 1 минуту
тогда при возврате в винду ошибка должна исчезнуть... проверю.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
15.06.2016, 12:11 #81
Цитата Сообщение от Petrolion Посмотреть сообщение
он такое может?!
Конечно. Само собой это не прошивается никуда, а действительно только до перезапуска. Причем, скорей всего так и есть, потому что для amd микрокод идет в linux-firmware, то есть в комплекте с базовой системой, в то время как для intel нужно отдельно ставить пакет.

Добавлено через 1 минуту
Цитата Сообщение от Petrolion Посмотреть сообщение
тогда при возврате в винду ошибка должна исчезнуть... проверю.
Смотрите сообщение выше. Изменения не сохраняются и действительны только до момента перезапуска. Для сохранения изменений, Вам нужно модифицировать BIOS.
Evg
Эксперт CАвтор FAQ
17633 / 5857 / 377
Регистрация: 30.03.2009
Сообщений: 16,154
Записей в блоге: 26
15.06.2016, 12:32 #82
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Правильный подход должен выглядеть так
1. Минимизируем текст и переписываем его на Си. Т.е. в идеале оставляем только цикл записи и цикл проверки. Все внешние функции по минимуму (в идеале malloc и printf вместо new и cout)
2. Из-под компилятора получаем ассемблерный файл. Далее учимся этот файл скармливать компилятору. В итоге мы получили текст программы на ассемблере, в котором зафиксирована требуемая последовательность операций, которая предположительно приводит к возникновению ошибки. Таким образом мы максимально отрезались от конкретной версии компилятора и конкретных его опций. Правда минимальная зависимость всё-таки остаётся (в виде вызовов функций malloc и printf), но скорее всего это роли не играет. В любом случае короткий ассемблерный фрагмент могут посмотреть специалисты на предмет того, мало ли тут есть ошибка в коде (и тогда виноватым следует назначить MSVC)
3. Далее зафиксированный ассемблерным текстом подаёшь в другие windows-компиляторы (ну мало ли там особенности с вызовами функций или передаче управления в main). С большой вероятностью на воспроизводимость ошибки это не повлияет, т.к. вероятнее всего для воспроизведения ошибки актуальной является именно последовательность команд
4. Дальше уже можно проводить эксперименты более мелкого уровня. Отдавать этот ассемблерный текст людям, запускать его под другими ОС и т.п. В каждой ОС могут быть свои особенности работы со страницами памяти. Из того, что под другой ОС ошибка не воспроизводится по прежнему никак не следует, что другая ОС работает лучше. Проблема может быть в динамической ситуации, которая наводится особенностями работы со страницами памяти в исходной ОС (типа того, что виртуальные страницы в определённом порядке отобразились на физические страницы)
Petrolion
24 / 24 / 7
Регистрация: 02.02.2016
Сообщений: 124
15.06.2016, 12:36  [ТС] #83
Цитата Сообщение от Toshkarik Посмотреть сообщение
Само собой это не прошивается никуда, а действительно только до перезапуска.
Грусть - печаль. Нового биоса для моей мамки нет. Старенькая она по современным меркам. Уже пятый год моей сборке. Патча микрокода под винду для АМД не встречал (может плохо смотрел).
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
15.06.2016, 12:41 #84
Petrolion, ну у них там плохо все с микрокодами, фиксы были только критические. Вроде, в 10 с этим дела обстоят получше.
avgoor
885 / 520 / 112
Регистрация: 05.12.2015
Сообщений: 1,465
15.06.2016, 12:47 #85
Цитата Сообщение от Toshkarik Посмотреть сообщение
linux-firmware, то есть в комплекте с базовой системой, в то время как для intel нужно отдельно ставить пакет.
Petrolion, Вы, кстати, винду давно обновляли?

Добавлено через 53 секунды
Например: https://support.microsoft.com/en-us/kb/2818604
Petrolion
24 / 24 / 7
Регистрация: 02.02.2016
Сообщений: 124
15.06.2016, 12:52  [ТС] #86
Evg,
1. На голом С не работал, но сделаю. (Не помню в MSVS есть ли чистый С)
2. Не пробовал получать ассемблерный код, но думаю тоже справлюсь. Но вот осилить этот массив кода потом - тут вера в себя уже не так крепка.
3. Пробовал свой код на другой машине. Правда с уменьшением размера памяти. Работало без проблем. Из чего сделал догадку, что чисто MSVC возможно не при чем.
4. Это уже слишком большое изыскание. Я и так злоупотребил вниманием сообщества.
Если выясниться что виновата система (не в чистом виде, а в силу покоробленности какой то части ее кода) и лечится это простой ее переустановкой. Думаю этого будет уже достаточно для меня (и возможно как мой опыт для других), что не стоит терять недели на поиск багов. Достаточно потерять день на полную переустановку всего.
Искать, что именно скривило в системе, не буду (я не на зарплате бетатестера Microsoft). Но это тоже опыт. Надеюсь кому-нибудь он может пригодиться.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
15.06.2016, 12:52 #87
Цитата Сообщение от avgoor Посмотреть сообщение
Petrolion, Вы, кстати, винду давно обновляли?
Вы, кстати, сообщение до конца прочитали?
И я не увидел связь процитированной части с Вашим сообщением.
Petrolion
24 / 24 / 7
Регистрация: 02.02.2016
Сообщений: 124
15.06.2016, 12:54  [ТС] #88
Цитата Сообщение от avgoor Посмотреть сообщение
Вы, кстати, винду давно обновляли?
, ну так она все время обновляется. Последнее обновление было позавчера.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
15.06.2016, 13:15 #89
avgoor, я к тому, что в окнах до 10, обновление микрокода редко происходили. Только если прям что то серьезное, ну или может быть просто для галочки. Недавно был случай с 8.1 на моей машине. Процессор не новый, sandy-bridge-e, 3930k. В BIOS микрокод был ревизии 0x705, винда обновила его до 0x70D. В то время, как последняя ревизия была 0x710. Причем датирована началом 13 года вроде.
avgoor
885 / 520 / 112
Регистрация: 05.12.2015
Сообщений: 1,465
15.06.2016, 13:18 #90
Цитата Сообщение от Toshkarik Посмотреть сообщение
И я не увидел связь процитированной части с Вашим сообщением
Связь в том, что linux - свежескачанный, а винда х.з. когда установленная и обновленная.

Цитата Сообщение от Petrolion Посмотреть сообщение
ну так она все время обновляется.
Ну, откуда я знаю? Модно, же на винде не думая отключать обновления. Помню, когда только появился UAC, везде спрашивали: "Как его отключить?". В то же время под линуксом все гордились, что для любого потенциально опасного действия выскакивала gksu. И меня не покидает мысль, что это одни и те же люди.

А вообще. У меня была только одна видяшка radeon. После нее я поклялся, что больше никогда...
Аналогично был только один процессор AMD, после которого, ну вы поняли...

Добавлено через 1 минуту
Toshkarik, ЕМНИП, у intel есть даже утилитка для обновления микрокода, а где его искать для AMD я не знаю.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.06.2016, 13:18
Привет! Вот еще темы с ответами:

Утечки при использовании порта завершения и соккетов - C++
Здравствуйте, уважаемые Гуру! Реализовываю сервер с использованием порта завершения. Всё работает, всё прекрасно. Одно меня смущает -...

ClientDataSet, Blob утечки памяти при записи в файл - Delphi
столкнулся с такой ситуацией, есть ClientdataSet в котором есть блоб поле, которое я записываю процедурой ниже: Procedure...

При записи файлов на диск, комптютер выдал ошибку, что данный диск не может дальше использоваться - Windows 7
При записи файлов на диск, через некоторое время мой комптютер выдал ошибку, что данный диск не может дальше использоваться(или что-то...

При закачке игры на жесткий диск пишет "Ошибка при записи на диск" - Жесткие диски
В системе 2 жестких диска. Так вот, при попытке установить на жесткий диск игры со стима пишет &quot;Ошибка при записи на диск&quot;, загрузка...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.06.2016, 13:18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru