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

Здесь можно сообщить о найденных багах в Far.
2useven10
Posts: 2978
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 2 times
Been thanked: 80 times

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

Post by 2useven10 » Sun 16 Jul, 2017 09:01

Latest post of the previous page:

DrKnS, может быть драйвер действительно выпущен так как описано...
но приседание в фар = явный сброс позиции в 0 после открытия, проблему бы решило и на производительности не отразилось.

User avatar
zg
zero-gravity
Posts: 5241
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 42 times
Contact:

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

Post by zg » Sun 16 Jul, 2017 09:58

приседать на каждый глючный драйвер - коленок не хватит. фар делает всё корректно.

falcon111
Posts: 15
Joined: Thu 13 Jul, 2017 16:25
Has thanked: 2 times

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

Post by falcon111 » Sun 16 Jul, 2017 12:15

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: 4563
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 2 times
Been thanked: 113 times
Contact:

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

Post by DrKnS » Sun 16 Jul, 2017 13:09

falcon111 wrote:
Sun 16 Jul, 2017 12:15
if ((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: 2978
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 2 times
Been thanked: 80 times

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

Post by 2useven10 » Sun 16 Jul, 2017 13:18

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

falcon111
Posts: 15
Joined: Thu 13 Jul, 2017 16:25
Has thanked: 2 times

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

Post by falcon111 » Sun 16 Jul, 2017 20:15

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: 2978
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 2 times
Been thanked: 80 times

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

Post by 2useven10 » Sun 16 Jul, 2017 21:32

falcon111, попробуйте для начала модифицированный тест в аттаче. путь подмените на свой.
Attachments
test_far.7z
(9.55 KiB) Downloaded 8 times

User avatar
DrKnS
Posts: 4563
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 2 times
Been thanked: 113 times
Contact:

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

Post by DrKnS » Sun 16 Jul, 2017 21:37

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

falcon111
Posts: 15
Joined: Thu 13 Jul, 2017 16:25
Has thanked: 2 times

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

Post by falcon111 » Sun 16 Jul, 2017 22:44

Мда, до последнего не верил. Даже с учетом реально кучи проблемных драйверов в последние годы. Чтобы с такими косяками и система работала... :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: 8025
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 99 times

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

Post by HaRT » Mon 17 Jul, 2017 00:04

falcon111 wrote:
Sun 16 Jul, 2017 22:44
надеюсь, оно нормально соберется vs2015
Может пригодиться это сообщение: https://forum.farmanager.com/viewtopic. ... 07#p144607, да и тема в целом. Если понадобится обсуждать сборку, то там самое место.
Фар есть инструмент, а не нянька. © 2009 DrKnS

falcon111
Posts: 15
Joined: Thu 13 Jul, 2017 16:25
Has thanked: 2 times

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

Post by falcon111 » Mon 17 Jul, 2017 00:51

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

Но вообще я это так не оставлю, виновника буду искать, если найду - отпишусь, что может так косячить.

falcon111
Posts: 15
Joined: Thu 13 Jul, 2017 16:25
Has thanked: 2 times

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

Post by falcon111 » Mon 17 Jul, 2017 14:29

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
Вот это Г вызывало косяки - привет акронисам.
Shit.png (17.74 KiB) Viewed 2283 times

2useven10
Posts: 2978
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 2 times
Been thanked: 80 times

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

Post by 2useven10 » Mon 17 Jul, 2017 15:06

Хорошо, что всё прояснилось.
На мой взгляд, вместо стояния с флагами - [Acronis ...], вполне можно нагрузить колени и таки
вставить подавление (да чужой) ошибки в код фар, тем более, что напрягаться сильно не надо.

Kirillony
Posts: 180
Joined: Tue 24 Jan, 2006 18:49
Has thanked: 1 time

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

Post by Kirillony » Mon 17 Jul, 2017 15:38


User avatar
DrKnS
Posts: 4563
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 2 times
Been thanked: 113 times
Contact:

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

Post by DrKnS » Mon 17 Jul, 2017 16:23

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

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

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

falcon111
Posts: 15
Joined: Thu 13 Jul, 2017 16:25
Has thanked: 2 times

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

Post by falcon111 » Mon 17 Jul, 2017 20:00

Со мной это было, поэтому я тоже скажу, хотя меня никто и не спрашивал, ибо я никакого отношения к разработке ФАРа не имею.
С точки зрения разработчика - его продукт должен иметь наибольшую беспроблемность, т.е. быть максимально совместимым со всеми драйверами, файловыми системами и пр. По-моему, это очевидно. От того, что ухудшенная (не избыточная) совместимость приведет к появлению глюков из-за несовместимости с чем-либо, 99% пользователей ФАРа легче не станет, потому что это будут "косяки ФАРа", я например, несмотря на больше 20 лет программерского опыта с разными языками-ос-архитектурами был уверен, что это именно косяк ФАРа. И если бы не 2useven10, который не поленился успешно повторить стабильно глючивший сценарий, за что ему еще раз спасибо, который я поленился повторять, считая глюк "плавающим", до сих пор был бы уверен что виноват фар. Мало кто, нарвавшись на глюк в ФАРе, сможет выяснить настоящую причину, и еще меньше - устранить ее. Поэтому вряд ли принципиальная позиция реально что-то изменит в лучшую сторону.
С другой стороны могу повторить сказанное мной парой постов выше - вставка избыточного позиционирования сразу после пересоздания файла не помогала, помогло уже непосредственно перед записью, т.е. вероятно, косяк еще зависел от задержки по времени между операциями, поэтому добавление избыточного позиционирования в случае чужих глюков проблему все равно может не решить, так что решение не однозначно.

User avatar
HaRT
Moderator
Posts: 8025
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 99 times

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

Post by HaRT » Mon 17 Jul, 2017 20:08

falcon111 wrote:
Mon 17 Jul, 2017 20:00
Поэтому вряд ли принципиальная позиция реально что-то изменит в лучшую сторону.
Если Вы не нажалуетесь преподробным образом в службу поддержки Акрониса, то шансы и впрямь минимальные. Зато если нажалуетесь, то ненулевые.
Фар есть инструмент, а не нянька. © 2009 DrKnS

Post Reply

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