Нулевые байты в начале файла при сохранении

Здесь можно сообщить о найденных багах в Far.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Нулевые байты в начале файла при сохранении

Post by DrKnS »

Latest post of the previous page:

falcon111 wrote: Sat 15 Jul, 2017 23:24 Осталось объяснить, почему страдает только фар, если он так от драйверов зависит.
Потому что у CreateFile весьма много параметров, а их комбинаций ещё больше.
А подход "хуяк, хуяк и в продакшн" не редкость: explorer работает, notepad работает, ну и отлично.

При сохранении фар открывает существующий файл с флагом TRUNCATE_EXISTING.
Ткну пальцем в небо и предположу, что этот флаг у вас обрабатывается криво.
Судя по картинке, файл таки обрезали, но при этом поинтер зачем-то засунули аж в конец, куда фар всё и записал.
2useven10
Posts: 5205
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

Нулевые байты в начале файла при сохранении

Post by 2useven10 »

DrKnS, может быть драйвер действительно выпущен так как описано...
но приседание в фар = явный сброс позиции в 0 после открытия, проблему бы решило и на производительности не отразилось.
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Нулевые байты в начале файла при сохранении

Post by zg »

приседать на каждый глючный драйвер - коленок не хватит. фар делает всё корректно.
falcon111
Posts: 16
Joined: Thu 13 Jul, 2017 16:25
Has thanked: 3 times

Нулевые байты в начале файла при сохранении

Post by falcon111 »

DrKnS wrote: Sun 16 Jul, 2017 00:53При сохранении фар открывает существующий файл с флагом TRUNCATE_EXISTING.
Ткну пальцем в небо и предположу, что этот флаг у вас обрабатывается криво.
Интересная теория. Test.c:

Code: Select all

#include <windows.h>
#include <stdio.h>

#define ITERATIONS_NUMBER 100000
#define ITERATIONS_STEP   1000
#define TEST_DATA_LENGTH1 1024
#define TEST_DATA_LENGTH2 (TEST_DATA_LENGTH1/2)

int main(int argc, char **argv) {
  int    i, j;
  HANDLE hand;
  DWORD  dw;
  char   FileName[MAX_PATH], Data1[TEST_DATA_LENGTH1], Data2[TEST_DATA_LENGTH2], ReadBuff[(TEST_DATA_LENGTH1+TEST_DATA_LENGTH2)*2];

  srand(time(NULL));
  for(j=0x86, i=0; i<TEST_DATA_LENGTH1; i++, j=(j>>1)+rand()-1) Data1[i]=j%256;
  for(i=0; i<TEST_DATA_LENGTH2; i++, j=(j>>1)+rand()-1) Data2[i]=j%256;
  for(i=0; i<ITERATIONS_NUMBER; i++) {
    sprintf(FileName, "Test_File_%u.bin", rand());
    if ((hand=CreateFile(FileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW,
                         FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_ARCHIVE, NULL))==INVALID_HANDLE_VALUE) {
      printf("Can't create file %s, err %d\n", FileName, GetLastError()); continue;
    }
    if (!WriteFile(hand, Data1, TEST_DATA_LENGTH1, &dw, NULL)||dw!=TEST_DATA_LENGTH1) printf("%s write error: %d bytes written, err %d\n", FileName, dw, GetLastError());
    if (!CloseHandle(hand)) printf("Close %s, err %d\n", FileName, GetLastError());

    if ((hand=CreateFile(FileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW|TRUNCATE_EXISTING,
                         FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_ARCHIVE, NULL))==INVALID_HANDLE_VALUE) {
      printf("Can't truncate file %s, err %d\n", FileName, GetLastError()); continue;
    }
    if (!WriteFile(hand, Data2, TEST_DATA_LENGTH2, &dw, NULL)||dw!=TEST_DATA_LENGTH2) printf("%s rewrite error: %d bytes written, err %d\n", FileName, dw, GetLastError());
    if (!CloseHandle(hand)) printf("Close %s, err %d\n", FileName, GetLastError());

    if ((hand=CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
                         FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_ARCHIVE, NULL))==INVALID_HANDLE_VALUE) {
      printf("Can't open file %s, err %d\n", FileName, GetLastError()); continue;
    }
    if (!ReadFile(hand, ReadBuff, sizeof(ReadBuff), &dw, NULL)||dw!=TEST_DATA_LENGTH2||memcmp(ReadBuff,Data2,dw)) printf("%s check failed: %d bytes readed, err %d\n", FileName, dw, GetLastError());
    if (!CloseHandle(hand)) printf("Close %s, err %d\n", FileName, GetLastError());
    if (!DeleteFile(FileName)) printf("%s remove error, err %d\n", FileName, GetLastError());
    if (i%ITERATIONS_STEP==0) printf("\r%d...", i);
  }
  printf("Completed.\n");
  return 0;
}
Написано в лоб, по рабоче-крестьянски, на виндовс-апи, чтобы исключить влияние С рантайма.

Code: Select all

T:\z>T:\z\test.exe
99000...
Completed.

T:\z>
Внезапно отработало все как положено. У ФАРа дрова виноваты с 1-2-3 попытки, а тут 100000 проверок, и драйвера ни разу не окривели.
В общем, позицию собравшихся здесь я понял, фар идеален, а если у кого-то что-то пошло не так, то он сам виноват. В целом позиция не новая, сталкивался, да. Дальнейшее обсуждение идеальности ФАРа я считаю бессмысленным.
Если есть что посоветовать или предложить проверить - я готов выслушать. А пока-что я откатываюсь на старую версию, мне работать надо, а не увлекаться занимательной ловлей глюков.
Last edited by falcon111 on Sun 16 Jul, 2017 12:19, edited 1 time in total.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Нулевые байты в начале файла при сохранении

Post by DrKnS »

falcon111 wrote: Sun 16 Jul, 2017 12:15if ((hand=CreateFile(FileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW|TRUNCATE_EXISTING
CreateFile function:
dwCreationDisposition [in]
This parameter must be one of the following values, which cannot be combined:
Выделение моё.
Вот как-то так, видимо, и ваши драйвера написаны, да.
falcon111 wrote: Sun 16 Jul, 2017 12:15В общем, позицию собравшихся здесь я понял, фар идеален, а если у кого-то что-то пошло не так, то он сам виноват
Вы бы попустились, вам помочь хотят.
2useven10
Posts: 5205
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

Нулевые байты в начале файла при сохранении

Post by 2useven10 »

DrKnS wrote: Sun 16 Jul, 2017 13:09CREATE_NEW|TRUNCATE_EXISTING
выглядит странно, но тем не менее CREATE_NEW|TRUNCATE_EXISTING = 1 | 5 = 5 = TRUNCATE_EXISTING
DrKnS wrote: Sun 16 Jul, 2017 13:09Вы бы попустились, вам помочь хотят.
с этим полностью согласен.
falcon111
Posts: 16
Joined: Thu 13 Jul, 2017 16:25
Has thanked: 3 times

Нулевые байты в начале файла при сохранении

Post by falcon111 »

DrKnS wrote: Sun 16 Jul, 2017 13:09Выделение моё.
А еще я там signed char заполняю остатком от деления на 256 - это тоже жуткий косяк. Вы msdn по CreateFile откройте, и посмотрите на константы, подумайте. Да, это плохая практика, но на работоспособность теста, написанного на коленке за 2 минуты - вполне допустимо, мне так понятнее, потому что это прямая аналогия с _O_CREAT|_O_TRUNC, на вин-апи я уже давно не пишу, только когда припрет.
По сути-то что скажете? Объяснить результат можете?
DrKnS wrote: Sun 16 Jul, 2017 13:09Вы бы попустились, вам помочь хотят.
Многим тут посоветовал бы. Может, был не прав, извиняюсь, но я пришел обсудить глюки, что характерно, стабильно повторяющиеся глюки. Ситуация - мечта разработчика, бери да лови. При этом, почитайте адресованные мне ответы. Да, может слишком эмоционально воспринял, потому что тут и так на взводе эти дни. Еще раз извиняюсь.
В общем, как я сказал, к конструктивному диалогу готов, если он будет. Впрочем, видимо мелкомягкие добрались до моего ноута со своим криэйторс апдейт, сегодня спросил опции перед установкой, видимо, сегодня-завтра установится апдейт, не факт что после апдейта ситуация с глюками сохранится.
2useven10
Posts: 5205
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

Нулевые байты в начале файла при сохранении

Post by 2useven10 »

falcon111, попробуйте для начала модифицированный тест в аттаче. путь подмените на свой.
Attachments
test_far.7z
(9.55 KiB) Downloaded 87 times
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Нулевые байты в начале файла при сохранении

Post by DrKnS »

falcon111 wrote: Sun 16 Jul, 2017 20:15я пришел обсудить глюки, что характерно, стабильно повторяющиеся глюки.
Стабильно повторяющиеся, заметьте, у вас одного.
falcon111 wrote: Sun 16 Jul, 2017 20:15По сути-то что скажете?
По сути - у вас есть исходный код, есть компилятор и умение им пользоваться. Поставьте сюда breakpoint и расскажите нам, что там происходит.
Это быстрее, чем писать на коленке тесты и продуктивнее, чем гадать по скриншотам.
falcon111
Posts: 16
Joined: Thu 13 Jul, 2017 16:25
Has thanked: 3 times

Нулевые байты в начале файла при сохранении

Post by falcon111 »

Мда, до последнего не верил. Даже с учетом реально кучи проблемных драйверов в последние годы. Чтобы с такими косяками и система работала... :crazy:
2useven10 wrote: Sun 16 Jul, 2017 21:32попробуйте для начала модифицированный тест в аттаче. путь подмените на свой.
Респект за имитацию сценария, я поленился. А надо было. Результат - всегда "ок", при этом, если в начале, перед запуском, файла test_Far_Overwrit.txt нет - тогда он появляется кривой, с нулями. Всегда. Если файл перед запуском теста есть - тогда все ок. Это жесть. Флаги FILE_FLAG_SEQUENTIAL_SCAN | FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_POSIX_SEMANTICS - все убирал (семантику убирал с подстановкой имени на обычное) - не во флагах дело.
Если перед WriteFile поставить SetFilePointer(fh, 0, NULL, FILE_BEGIN); - то все пучком всегда.
Чувствую, придется искать виновника, как бы ни хотелось тратить время.

Я бы на вашем месте добавил SetFilePointer() в код, если такие косяки реально бывают и система не крашится от них... Перфекционизм - это дело хорошее, но, как мне кажется, не в этом случае. Пока пошел качать транк и пытаться собрать свой билд, надеюсь, оно нормально соберется vs2015 и не потребует дополнительных приблуд и прочего напильника.
User avatar
HaRT
Moderator
Posts: 10822
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Нулевые байты в начале файла при сохранении

Post by HaRT »

falcon111 wrote: Sun 16 Jul, 2017 22:44надеюсь, оно нормально соберется vs2015
Может пригодиться это сообщение: viewtopic.php?p=144607#p144607, да и тема в целом. Если понадобится обсуждать сборку, то там самое место.
Фар есть инструмент, а не нянька. © 2009 DrKnS
falcon111
Posts: 16
Joined: Thu 13 Jul, 2017 16:25
Has thanked: 3 times

Нулевые байты в начале файла при сохранении

Post by falcon111 »

HaRT wrote: Mon 17 Jul, 2017 00:04Может пригодиться это сообщение:
Спасибо, уже пересобрал (попробовал еще icl v17 собрать - я штатно icl пользуюсь с древних лет- с ходу не вышло, потом посмотрю).
Добавление EditFile.SetPointer(0, nullptr, FILE_BEGIN) непосредственно после пересоздания файла не помогло :shock:
Поставил перед EditFile.Write - тогда стало, вроде, норм. Хоть одной проблемой пока меньше.

Но вообще я это так не оставлю, виновника буду искать, если найду - отпишусь, что может так косячить.
falcon111
Posts: 16
Joined: Thu 13 Jul, 2017 16:25
Has thanked: 3 times

Нулевые байты в начале файла при сохранении

Post by falcon111 »

falcon111 wrote: Mon 17 Jul, 2017 00:51Но вообще я это так не оставлю, виновника буду искать, если найду - отпишусь, что может так косячить.
Дааа, убил полдня чтобы найти причину, оказалось - Acronis Active Protection (TM) Service.
C:\Program Files (x86)\Common Files\Acronis\ActiveProtection\anti_ransomware_service.exe
Остановил службу, и все чудесным образом прошло, раз 10 запускал тест по сценарию с косяком - все ок. Запускаю сервис - со второго запуска косяк во весь рост.
Какого хрена акронис - инструмент для бэкапа - вообще полез куда его не звали - в некую "защиту"...

Две команды
sc stop AcronisActiveProtectionService
sc delete AcronisActiveProtectionService
вылечивают систему, если кто еще так "подорвется".

Всем учавствовавшим в обсуждении - спасибо.
Attachments
Вот это Г вызывало косяки - привет акронисам.
Вот это Г вызывало косяки - привет акронисам.
Shit.png (17.74 KiB) Viewed 10021 times
2useven10
Posts: 5205
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

Нулевые байты в начале файла при сохранении

Post by 2useven10 »

Хорошо, что всё прояснилось.
На мой взгляд, вместо стояния с флагами - [Acronis ...], вполне можно нагрузить колени и таки
вставить подавление (да чужой) ошибки в код фар, тем более, что напрягаться сильно не надо.
Kirillony
Posts: 232
Joined: Tue 24 Jan, 2006 18:49
Has thanked: 6 times
Been thanked: 4 times

Нулевые байты в начале файла при сохранении

Post by Kirillony »

User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Нулевые байты в начале файла при сохранении

Post by DrKnS »

2useven10 wrote: Mon 17 Jul, 2017 15:06вполне можно нагрузить колени и таки
вставить подавление (да чужой) ошибки в код фар
В краткосрочной перспективе - да. У пользователей акрониса будет меньше испорченных файлов, а у нас меньше левых багрепортов.

В долгосрочной - не факт.
Не проявись этот баг в фаре, он бы проявился где-то ещё. Или не проявился бы и просто втихаря портил файлы. Изредка. Но, по закону Мёрфи, с максимальным ущербом.

В результате же этого обсуждения топикстартер разобрался и предотвратил маловероятное (но возможное) вырывание волос отовсюду в один прекрасный пятничный вечер в конце квартала, а если напишет в техподдержку акрониса - возможно, предотвратит ещё кому-нибудь и мир станет немного лучше.
Ради этого я, в принципе, не против раз в год-два кому-нибудь ещё подоказывать, что это не наш баг.
Post Reply

Return to “Глюки и баги”