загадочная ошибка (программистское)
Jul. 1st, 2004 09:15 pmЯ записывал на болванку три больших файла (.avi). Вместе они занимают почти целый CD.
Обычно я это делаю (в Линуксе) так: сначала с помощью программы mkisofs создаю образ файловой системы iso9660, включающей нужные файлы, а потом с помощью программы cdrdao пишу этот образ на диск, в режиме DAO (Disk-At-Once). На этот раз я решил вместо cdrdao попробовать воспользоваться cdrecord, более универсальной программой для записи дисков. В принципе она использует, насколько я понимаю, ту же библиотеку нижнего уровня, что и cdrdao, но умеет также записывать диски в более ортодоксальном режиме TAO (Track-At-Once), а также мультсессионные диски итп.
Короче, я разобрался с опциями и запустил cdrecord в режиме TAO. Диск записался. Я решил проверить запись, и запустил расчёт контрольной суммы по файлам, читая их прямо с CD (запустив программу md5sum прямо в директории CD). К моему удивлению, все три контрольные суммы оказались неправильными - они не совпадали с контрольными суммами оригинальных файлов, которые я ещё не удалил. Тогда я запустил побайтовое сравнение. И что же я обнаружил! Каждый из записанных файлов отличается от оригинала в одном байте (в разных местах в каждом файле). И в каждом из этих байтов различие в значении было ровно 10 — в записанном файле на 10 больше, чем в первоначальном. Но при этом сами значения байтов были разные, и настолько, что биты всякий раз менялись другие!
Очень любопытный баг (или дефект). Пожалуй, я потрачу ещё несколько болванок на попытки его повторить и исследовать...
Обычно я это делаю (в Линуксе) так: сначала с помощью программы mkisofs создаю образ файловой системы iso9660, включающей нужные файлы, а потом с помощью программы cdrdao пишу этот образ на диск, в режиме DAO (Disk-At-Once). На этот раз я решил вместо cdrdao попробовать воспользоваться cdrecord, более универсальной программой для записи дисков. В принципе она использует, насколько я понимаю, ту же библиотеку нижнего уровня, что и cdrdao, но умеет также записывать диски в более ортодоксальном режиме TAO (Track-At-Once), а также мультсессионные диски итп.
Короче, я разобрался с опциями и запустил cdrecord в режиме TAO. Диск записался. Я решил проверить запись, и запустил расчёт контрольной суммы по файлам, читая их прямо с CD (запустив программу md5sum прямо в директории CD). К моему удивлению, все три контрольные суммы оказались неправильными - они не совпадали с контрольными суммами оригинальных файлов, которые я ещё не удалил. Тогда я запустил побайтовое сравнение. И что же я обнаружил! Каждый из записанных файлов отличается от оригинала в одном байте (в разных местах в каждом файле). И в каждом из этих байтов различие в значении было ровно 10 — в записанном файле на 10 больше, чем в первоначальном. Но при этом сами значения байтов были разные, и настолько, что биты всякий раз менялись другие!
Очень любопытный баг (или дефект). Пожалуй, я потрачу ещё несколько болванок на попытки его повторить и исследовать...
no subject
Date: 2004-07-01 11:24 am (UTC)no subject
Date: 2004-07-01 11:36 am (UTC)no subject
Date: 2004-07-01 11:24 am (UTC)no subject
Date: 2004-07-01 11:31 am (UTC)no subject
Date: 2004-07-01 11:37 am (UTC)no subject
Date: 2004-07-01 12:11 pm (UTC)no subject
Date: 2004-07-01 12:13 pm (UTC):)
no subject
Date: 2004-07-01 12:58 pm (UTC)no subject
Date: 2004-07-01 01:35 pm (UTC)У меня были похожие симптомы, вылечилось заменой памяти.
no subject
Date: 2004-07-01 03:00 pm (UTC)no subject
Date: 2004-07-02 12:11 am (UTC)no subject
Date: 2004-07-01 05:22 pm (UTC)С http-сервера, который работал под linux неправильно скачивались файлы. Ошибка тоже была в одном байте. Чаще всего менялся крайний бит байта, т.е., например, C2 превращался в C3. Иногда значение байта увеличивалось на 2. Но в одном большом файле такая ошибка могла встретиться в нескольких местах.
Адрес ошибочного байта был не любой, а подпадал под такую зависимость:
4096*N + k.
Если в 16-ричной системе записать, то будет просто 1000*N + k
Если значение байта увеличивалось на 1, то при этом было одно значение k, если увеличивалось на 2, то другое k.
А виноват оказался глючной модуль памяти на сервере.
После того, как его поменяли, ошибки исчезли.
no subject
Date: 2004-07-02 01:58 am (UTC)правда, не очень ясно, как считать :)
no subject
Date: 2004-07-02 05:38 am (UTC)no subject
Date: 2004-07-02 02:00 am (UTC)no subject
Date: 2004-07-02 05:38 am (UTC)no subject
Date: 2004-07-02 05:09 am (UTC)Бедный китаец :)
no subject
Date: 2004-07-02 09:23 am (UTC)