Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/29: Рейтинг темы: голосов - 29, средняя оценка - 4.76
24 / 24 / 8
Регистрация: 02.02.2016
Сообщений: 135
1

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

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

Author24 — интернет-сервис помощи студентам
Доброго дня форумчане!
Сорри если оффтоп но... Пишу в консольке на 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
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.06.2016, 14:42
Ответы с готовыми решениями:

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

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

При закачке игры на жесткий диск пишет "Ошибка при записи на диск"
БЕДА В СЕМЬЕ! В системе 2 жестких диска: первый - 250гб(разбит на 2 раздела), второй - 1тб Так...

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

119
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
15.06.2016, 12:11 81
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Petrolion Посмотреть сообщение
он такое может?!
Конечно. Само собой это не прошивается никуда, а действительно только до перезапуска. Причем, скорей всего так и есть, потому что для amd микрокод идет в linux-firmware, то есть в комплекте с базовой системой, в то время как для intel нужно отдельно ставить пакет.

Добавлено через 1 минуту
Цитата Сообщение от Petrolion Посмотреть сообщение
тогда при возврате в винду ошибка должна исчезнуть... проверю.
Смотрите сообщение выше. Изменения не сохраняются и действительны только до момента перезапуска. Для сохранения изменений, Вам нужно модифицировать BIOS.
1
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
15.06.2016, 12:32 82
Лучший ответ Сообщение было отмечено HighPredator как решение

Решение

Правильный подход должен выглядеть так
1. Минимизируем текст и переписываем его на Си. Т.е. в идеале оставляем только цикл записи и цикл проверки. Все внешние функции по минимуму (в идеале malloc и printf вместо new и cout)
2. Из-под компилятора получаем ассемблерный файл. Далее учимся этот файл скармливать компилятору. В итоге мы получили текст программы на ассемблере, в котором зафиксирована требуемая последовательность операций, которая предположительно приводит к возникновению ошибки. Таким образом мы максимально отрезались от конкретной версии компилятора и конкретных его опций. Правда минимальная зависимость всё-таки остаётся (в виде вызовов функций malloc и printf), но скорее всего это роли не играет. В любом случае короткий ассемблерный фрагмент могут посмотреть специалисты на предмет того, мало ли тут есть ошибка в коде (и тогда виноватым следует назначить MSVC)
3. Далее зафиксированный ассемблерным текстом подаёшь в другие windows-компиляторы (ну мало ли там особенности с вызовами функций или передаче управления в main). С большой вероятностью на воспроизводимость ошибки это не повлияет, т.к. вероятнее всего для воспроизведения ошибки актуальной является именно последовательность команд
4. Дальше уже можно проводить эксперименты более мелкого уровня. Отдавать этот ассемблерный текст людям, запускать его под другими ОС и т.п. В каждой ОС могут быть свои особенности работы со страницами памяти. Из того, что под другой ОС ошибка не воспроизводится по прежнему никак не следует, что другая ОС работает лучше. Проблема может быть в динамической ситуации, которая наводится особенностями работы со страницами памяти в исходной ОС (типа того, что виртуальные страницы в определённом порядке отобразились на физические страницы)
3
24 / 24 / 8
Регистрация: 02.02.2016
Сообщений: 135
15.06.2016, 12:36  [ТС] 83
Цитата Сообщение от Toshkarik Посмотреть сообщение
Само собой это не прошивается никуда, а действительно только до перезапуска.
Грусть - печаль. Нового биоса для моей мамки нет. Старенькая она по современным меркам. Уже пятый год моей сборке. Патча микрокода под винду для АМД не встречал (может плохо смотрел).
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
15.06.2016, 12:41 84
Petrolion, ну у них там плохо все с микрокодами, фиксы были только критические. Вроде, в 10 с этим дела обстоят получше.
1
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
15.06.2016, 12:47 85
Цитата Сообщение от Toshkarik Посмотреть сообщение
linux-firmware, то есть в комплекте с базовой системой, в то время как для intel нужно отдельно ставить пакет.
Petrolion, Вы, кстати, винду давно обновляли?

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

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

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

Добавлено через 1 минуту
Toshkarik, ЕМНИП, у intel есть даже утилитка для обновления микрокода, а где его искать для AMD я не знаю.
1
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
15.06.2016, 13:28 91
Цитата Сообщение от avgoor Посмотреть сообщение
Toshkarik, ЕМНИП, у intel есть даже утилитка для обновления микрокода, а где его искать для AMD я не знаю.
Для амд искать не нужно, все включено в само ядро. Intel же отдельно на своем сайте предостовляет бинарник со всеми микрокодами для всех процессоров. Раньше нужно было ставить отдельно утилиту microcode-ctl для обновления микрокода intel. Ну и скачивать соответственно бинарник с их сайта и класть в папку /lib/firmware. Сейчас все так же нужно скачивать бинарник, но microcode-ctl уже deprecated, так как он обновляет код во время загрузки ядра, а для многих последних моделей это нужно делать до его загрузки. Теперь используется early microcode update. С помощью утилиты ( iucode-tool вроде ) создается бинарник, который добавляется в конфиг загрузчика и грузится до initramfs, обновляет код и передает управление initramfs. Но это все, как можно догадаться, только для linux. В win ничего такого делать нельзя.
1
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
15.06.2016, 13:50 92
Цитата Сообщение от Petrolion Посмотреть сообщение
4. Это уже слишком большое изыскание. Я и так злоупотребил вниманием сообщества.
Так никто же не заставляет. Кому интересно, те проверят. Не каждый день люди работают с аппаратными ошибками

Цитата Сообщение от Petrolion Посмотреть сообщение
Если выясниться что виновата система (не в чистом виде, а в силу покоробленности какой то части ее кода) и лечится это простой ее переустановкой.
Так вот чтобы более точно определить, система виновата, или нет, нужен качественный и тест. Т.е в идеале сокращённый вариант, написанный на ассемблере. При таком подходе можно будет с бОльшей уверенностью говорить, что ошибка в системе (если по внешним признакам она в системе), а не в железе
1
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
15.06.2016, 14:04 93
Цитата Сообщение от Evg Посмотреть сообщение
Не каждый день люди работают с аппаратными ошибками
всем киберфорумом уже который день пытаемся забороть глюк. уже и анигиляторы и дезинтеграторы применяли, пока глухо)

Добавлено через 48 секунд
мне кажется что система с такой изюминкой должна периодически выпадать в синий экран
2
24 / 24 / 8
Регистрация: 02.02.2016
Сообщений: 135
15.06.2016, 15:19  [ТС] 94
6 часов работы под Дебианом и ни одного сбоя. (На ночь еще поставлю)
Вернулся на Винду. "облегчил" код:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream>
#include <stdio.h>
 
 
int main()
{
    int n = 1<<30;
    int k = 3<<24;
    unsigned long long c = 0;
    bool te = true;
    
    while (te)
    {
        unsigned long long * b = (unsigned long long *)malloc(sizeof(unsigned long long)*n);
        printf("Array at addres (%X). \n", b );
        for (int i = 0; i < n; i++)     //Asc tab
            b[i]=k+i;
        printf("Table asc ready. Read:");
        for (int m = 0; m < 2; m++)
        {
            printf("%d", m);
            c = k;
            for (int i = 0; i < n; i++,c++)
                if (b[i] != c)
                    printf("\nError at adr(%X). Value: %X must be: %X\n", (b+i), b[i], c );
        }
        printf("\n");
 
        for (int i = 0; i < n; i++)     //Clr tab
            b[i]=0;
        printf("Table clear ready. Read:");
        for (int m = 0; m < 2; m++)
        {
            printf("%d", m);
            for (int i = 0; i < n; i++)
                if (b[i] != 0)
                    printf("\nError at adr(%X). Value: %X must be: 0\n", (b+i), b[i]);
        }
        printf("\n");
 
        for (int i = 0; i < n; i++)
            b[i]=0xffffffffffffffff;
        printf("Table bit ready. Read:");
        for (int m = 0; m < 2; m++)
        {
            printf("%d", m);
            c = 0xffffffffffffffff;
            for (int i = 0; i < n; i++)
                if (b[i] != c)
                {
                    printf("\nError at adr(%X). Value: %X must be: %X\n", (b+i), b[i], c);
                }
        }
        printf("\n");
 
        c = (unsigned long long)k;
        for (int i = 0; i < n; i++,c++)     //Asc2 tab
            b[i]=c;
        printf("Table asc2 ready. Read:");
        for (int m = 0; m < 2; m++)
        {
            printf("%d", m);
            c = k;
            for (int i = 0; i < n; i++,c++)
                if (b[i] != c)
                {
                    printf("\nError at adr(%X). Value: %X must be: %X\n", (b+i), b[i], c);
                }
        }
        printf("\n");
        free(b);
    }
return 0;
}

добавил промежуточное построение кода ассемблера с исходником в ремарках (в приаттаченном архиве).
Запустил приложение и вуаля. За 10 минут такого насмотрелся... (пара кусков ниже)
Кликните здесь для просмотра всего текста
Array at addres (3FF70040).
Table asc ready. Read:0
Error at adr(3668B928). Value: 20CE371D must be: 21CE371D
1
Error at adr(3668B928). Value: 20CE371D must be: 21CE371D

Table clear ready. Read:01
Table bit ready. Read:0
Error at adr(3668B928). Value: FEFFFFFF must be: FFFFFFFF
1
Error at adr(3668B928). Value: FEFFFFFF must be: FFFFFFFF

Table asc2 ready. Read:0
Error at adr(3668B928). Value: 20CE371D must be: 21CE371D
1
Error at adr(3668B928). Value: 20CE371D must be: 21CE371D

Array at addres (3FF70040).
Table asc ready. Read:0
Error at adr(720A8928). Value: 842711D must be: 942711D
1
Error at adr(720A8928). Value: 842711D must be: 942711D

Table clear ready. Read:01
Table bit ready. Read:0
Error at adr(720A8928). Value: FEFFFFFF must be: FFFFFFFF
1
Error at adr(720A8928). Value: FEFFFFFF must be: FFFFFFFF

Table asc2 ready. Read:01
Array at addres (3FF70040).

....CUT......

Array at addres (3FF70040).
Table asc ready. Read:01
Table clear ready. Read:01
Table bit ready. Read:0
Error at adr(39C48928). Value: FEFFFFFF must be: FFFFFFFF
1
Error at adr(39C48928). Value: FEFFFFFF must be: FFFFFFFF

Table asc2 ready. Read:01
Array at addres (3FF70040).
Table asc ready. Read:01
Table clear ready. Read:01
Table bit ready. Read:01
Table asc2 ready. Read:01
Array at addres (3FF70040).
Table asc ready. Read:0
Error at adr(9F281918). Value: FE6231B must be: EE6231B
1
Error at adr(9F281918). Value: FE6231B must be: EE6231B

Table clear ready. Read:01
Table bit ready. Read:01
Table asc2 ready. Read:0
Error at adr(9F281918). Value: FE6231B must be: EE6231B
1
Error at adr(9F281918). Value: FE6231B must be: EE6231B

Array at addres (3FF70040).
Table asc ready. Read:01
Table clear ready. Read:01
Table bit ready. Read:01
Table asc2 ready. Read:01
Array at addres (3FF70040).
Table asc ready. Read:0
Error at adr(627E2928). Value: 2650E51D must be: 2750E51D
1
Error at adr(627E2928). Value: 2650E51D must be: 2750E51D

Table clear ready. Read:01
Table bit ready. Read:01
Table asc2 ready. Read:01
Array at addres (3FF70040).
Table asc ready. Read:01
Table clear ready. Read:01
Table bit ready. Read:01
Table asc2 ready. Read:01
Array at addres (3FF70040).
Table asc ready. Read:01
Table clear ready. Read:0
Error at adr(A0B51918). Value: 1000000 must be: 0
1
Error at adr(A0B51918). Value: 1000000 must be: 0

Table bit ready. Read:01
Table asc2 ready. Read:01
Array at addres (3FF70040).
Table asc ready. Read:0
Error at adr(804DB928). Value: A0AD71D must be: B0AD71D
1
Error at adr(804DB928). Value: A0AD71D must be: B0AD71D

Table clear ready. Read:01
Table bit ready. Read:01
Table asc2 ready. Read:01
Error at adr(804DB928). Value: A0AD71D must be: B0AD71D

Array at addres (3FF70040).

Впервые сработала ошибка появления бита при обнулении...
Начал собирать вещички... (инфу которую нужно перенести в новую систему).

Да, не скрою, что BSOD-ы бывают. Ну это же винда, и даже не сервер. Например, если оставляю программы считать на несколько дней, то в течении 5-6 дней обязательно винда повалится. (На прошлой работе у нас даже сервера под Windows Server не работали дольше 1-2 месяцев подряд. А вот "последний из могикан" Novel работал почти 600 дней кряду и то его руками просто валили. Линуксы пахали до года, но тоже не по своей воле их перегружали.)
Вложения
Тип файла: zip proba.zip (3.1 Кб, 4 просмотров)
0
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
15.06.2016, 15:27 95
Petrolion, сделайте сборку с <<28 а то у меня не запуститься и мы так и будем сравнивать теплое с мягким
1
24 / 24 / 8
Регистрация: 02.02.2016
Сообщений: 135
15.06.2016, 15:31  [ТС] 96
vxg, а можете собрать код при n=1<<30 ?
А то, боюсь, 2 гига не то что я хотел бы поймать.
И почему exe (хоть и упакованный) такой огромный?
0
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
15.06.2016, 15:35 97
Petrolion, пересобрать я могу хоть << 300 Но на той машине на которой проходит тест в отличие от вашей не стоит 1024 гигабайт оперативной памяти а лишь 4 и приложение тупо вылетает с исключением если пробовать запуск с <<30 а при запуске с << 29 лагает так что жесть просто (идет постоянный своп просто убивающий жесткий) поэтому и говорю про << 28

Добавлено через 41 секунду
Цитата Сообщение от Petrolion Посмотреть сообщение
И почему exe (хоть и упакованный) такой огромный?
ну такой сгенерил TDM я не знаю чего он туда насовал
1
24 / 24 / 8
Регистрация: 02.02.2016
Сообщений: 135
15.06.2016, 15:41  [ТС] 98
Я хотел вашу сборку для <<30 прогнать у себя.
А для << 28 во вложении файл.
Но если не стоит распространяемого пакета для поддержки MSVC2010, то его ставить отсюда x64, а отсюда x86.
Без пакета поддержки, к сожалению не работает.
Вложения
Тип файла: zip proba_exe.zip (3.4 Кб, 4 просмотров)
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
15.06.2016, 16:13 99
Не могли бы Вы скинуть исходник, из которого был сгенерирован тот асм. листинг?

Добавлено через 4 минуты
Извиняюсь, не увидел сразу. Нашел.
1
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
15.06.2016, 16:52 100
Petrolion, интересно как вы думаете ловить ошибку при долгом тесте если код не останавливается при ее определении а пашет дальше с отключенным логом в файл?

Добавлено через 27 секунд
немигая смотреть на черный экран? зашбсь
1
15.06.2016, 16:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.06.2016, 16:52
Помогаю со студенческими работами здесь

Измерить скорость чтения и записи данных на диск
Определить скорости чтения и записи блока данных доступных для чтения и записи логических дисков....

Ошибка при записи на диск
Здравствуйте, у меня возникла проблема с жесткими дисками. Многим известна игровая платформа...

Ошибки при записи на DVD диск
Помогите, пожалуйста, разобраться со следующей ситуацией. Занимался записью iso-образов на DVD...

Жесткий диск тормозит при записи на него
У меня есть старый компьютер с процессором Celeron 1700 MHz. Выпуска начала 2000-х. Это мой первый...


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

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru