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

C++

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

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

06.06.2016, 14:42. Просмотров 3113. Ответов 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++ Builder
C++ Напишите функции записи данных в файл, чтения данных из файла
Visual C++ Утечки памяти
C++ Builder Утечки памяти...
Утечки памяти C++
C++ Ошибка при записи данных в файл
C++ Builder Составить программу для ввода данных о студентах, проживающих в общежитии, и записи этих данных в файл
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
15.06.2016, 12:11     Битовые утечки при записи данных на диск #81
Цитата Сообщение от Petrolion Посмотреть сообщение
он такое может?!
Конечно. Само собой это не прошивается никуда, а действительно только до перезапуска. Причем, скорей всего так и есть, потому что для amd микрокод идет в linux-firmware, то есть в комплекте с базовой системой, в то время как для intel нужно отдельно ставить пакет.

Добавлено через 1 минуту
Цитата Сообщение от Petrolion Посмотреть сообщение
тогда при возврате в винду ошибка должна исчезнуть... проверю.
Смотрите сообщение выше. Изменения не сохраняются и действительны только до момента перезапуска. Для сохранения изменений, Вам нужно модифицировать BIOS.
Evg
Эксперт CАвтор FAQ
17391 / 5629 / 352
Регистрация: 30.03.2009
Сообщений: 15,416
Записей в блоге: 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
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
15.06.2016, 12:41     Битовые утечки при записи данных на диск #84
Petrolion, ну у них там плохо все с микрокодами, фиксы были только критические. Вроде, в 10 с этим дела обстоят получше.
avgoor
879 / 514 / 111
Регистрация: 05.12.2015
Сообщений: 1,455
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
1139 / 856 / 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
1139 / 856 / 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
879 / 514 / 111
Регистрация: 05.12.2015
Сообщений: 1,455
15.06.2016, 13:18     Битовые утечки при записи данных на диск #90
Цитата Сообщение от Toshkarik Посмотреть сообщение
И я не увидел связь процитированной части с Вашим сообщением
Связь в том, что linux - свежескачанный, а винда х.з. когда установленная и обновленная.

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

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

Добавлено через 1 минуту
Toshkarik, ЕМНИП, у intel есть даже утилитка для обновления микрокода, а где его искать для AMD я не знаю.
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
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 ничего такого делать нельзя.
Evg
Эксперт CАвтор FAQ
17391 / 5629 / 352
Регистрация: 30.03.2009
Сообщений: 15,416
Записей в блоге: 26
15.06.2016, 13:50     Битовые утечки при записи данных на диск #92
Цитата Сообщение от Petrolion Посмотреть сообщение
4. Это уже слишком большое изыскание. Я и так злоупотребил вниманием сообщества.
Так никто же не заставляет. Кому интересно, те проверят. Не каждый день люди работают с аппаратными ошибками

Цитата Сообщение от Petrolion Посмотреть сообщение
Если выясниться что виновата система (не в чистом виде, а в силу покоробленности какой то части ее кода) и лечится это простой ее переустановкой.
Так вот чтобы более точно определить, система виновата, или нет, нужен качественный и тест. Т.е в идеале сокращённый вариант, написанный на ассемблере. При таком подходе можно будет с бОльшей уверенностью говорить, что ошибка в системе (если по внешним признакам она в системе), а не в железе
vxg
Модератор
3062 / 1864 / 196
Регистрация: 13.01.2012
Сообщений: 7,087
15.06.2016, 14:04     Битовые утечки при записи данных на диск #93
Цитата Сообщение от Evg Посмотреть сообщение
Не каждый день люди работают с аппаратными ошибками
всем киберфорумом уже который день пытаемся забороть глюк. уже и анигиляторы и дезинтеграторы применяли, пока глухо)

Добавлено через 48 секунд
мне кажется что система с такой изюминкой должна периодически выпадать в синий экран
Petrolion
24 / 24 / 7
Регистрация: 02.02.2016
Сообщений: 124
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 Кб, 3 просмотров)
vxg
Модератор
3062 / 1864 / 196
Регистрация: 13.01.2012
Сообщений: 7,087
15.06.2016, 15:27     Битовые утечки при записи данных на диск #95
Petrolion, сделайте сборку с <<28 а то у меня не запуститься и мы так и будем сравнивать теплое с мягким
Petrolion
24 / 24 / 7
Регистрация: 02.02.2016
Сообщений: 124
15.06.2016, 15:31  [ТС]     Битовые утечки при записи данных на диск #96
vxg, а можете собрать код при n=1<<30 ?
А то, боюсь, 2 гига не то что я хотел бы поймать.
И почему exe (хоть и упакованный) такой огромный?
vxg
Модератор
3062 / 1864 / 196
Регистрация: 13.01.2012
Сообщений: 7,087
15.06.2016, 15:35     Битовые утечки при записи данных на диск #97
Petrolion, пересобрать я могу хоть << 300 Но на той машине на которой проходит тест в отличие от вашей не стоит 1024 гигабайт оперативной памяти а лишь 4 и приложение тупо вылетает с исключением если пробовать запуск с <<30 а при запуске с << 29 лагает так что жесть просто (идет постоянный своп просто убивающий жесткий) поэтому и говорю про << 28

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

Добавлено через 4 минуты
Извиняюсь, не увидел сразу. Нашел.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.06.2016, 16:52     Битовые утечки при записи данных на диск
Еще ссылки по теме:

C++ Builder Избежать утечки памяти при преобразовании строки в массив символов
C++ Утечки памяти при использовании new/delete для двумерных массивов
Утечки при использовании порта завершения и соккетов C++
Битовые операции с разными типа данных C++

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

Или воспользуйтесь поиском по форуму:
vxg
Модератор
3062 / 1864 / 196
Регистрация: 13.01.2012
Сообщений: 7,087
15.06.2016, 16:52     Битовые утечки при записи данных на диск #100
Petrolion, интересно как вы думаете ловить ошибку при долгом тесте если код не останавливается при ее определении а пашет дальше с отключенным логом в файл?

Добавлено через 27 секунд
немигая смотреть на черный экран? зашбсь
Yandex
Объявления
15.06.2016, 16:52     Битовые утечки при записи данных на диск
Ответ Создать тему
Опции темы

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