?

Log in

No account? Create an account
загадочная ошибка (программистское) - Поклонник деепричастий [entries|archive|friends|userinfo]
Anatoly Vorobey

[ website | Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Links
[Links:| English-language weblog ]

загадочная ошибка (программистское) [июл. 1, 2004|09:15 pm]
Anatoly Vorobey
Я записывал на болванку три больших файла (.avi). Вместе они занимают почти целый CD.
Обычно я это делаю (в Линуксе) так: сначала с помощью программы mkisofs создаю образ файловой системы iso9660, включающей нужные файлы, а потом с помощью программы cdrdao пишу этот образ на диск, в режиме DAO (Disk-At-Once). На этот раз я решил вместо cdrdao попробовать воспользоваться cdrecord, более универсальной программой для записи дисков. В принципе она использует, насколько я понимаю, ту же библиотеку нижнего уровня, что и cdrdao, но умеет также записывать диски в более ортодоксальном режиме TAO (Track-At-Once), а также мультсессионные диски итп.

Короче, я разобрался с опциями и запустил cdrecord в режиме TAO. Диск записался. Я решил проверить запись, и запустил расчёт контрольной суммы по файлам, читая их прямо с CD (запустив программу md5sum прямо в директории CD). К моему удивлению, все три контрольные суммы оказались неправильными - они не совпадали с контрольными суммами оригинальных файлов, которые я ещё не удалил. Тогда я запустил побайтовое сравнение. И что же я обнаружил! Каждый из записанных файлов отличается от оригинала в одном байте (в разных местах в каждом файле). И в каждом из этих байтов различие в значении было ровно 10 — в записанном файле на 10 больше, чем в первоначальном. Но при этом сами значения байтов были разные, и настолько, что биты всякий раз менялись другие!

Очень любопытный баг (или дефект). Пожалуй, я потрачу ещё несколько болванок на попытки его повторить и исследовать...
СсылкаОтветить

Comments:
[User Picture]From: magister_
2004-07-01 11:24 am
Сначала образ проверьте...
(Ответить) (Thread)
[User Picture]From: avva
2004-07-01 11:36 am
Образ я проверил ещё перед записью, он в порядке был.
(Ответить) (Parent) (Thread)
[User Picture]From: ush
2004-07-01 11:24 am
Это big brother.
(Ответить) (Thread)
[User Picture]From: avva
2004-07-01 11:37 am
Это я читал, да, это ужас ;) но в данном случае что-то другое явно.
(Ответить) (Parent) (Thread)
[User Picture]From: gholam
2004-07-01 12:11 pm
Кстати, мне недавно попался диск с похожим глюком - при попытке чтения одного из файлов, *драйв* исчезал из системы и переставал откликатся на запросы (включая тыканье в кнопку). Вис то есть. Самое забавное - диск был родным, штампованным диском с драйверами для внешнего 56К модема от US Robotics. Драйв - новенький CDROM от NEC.
(Ответить) (Parent) (Thread)
[User Picture]From: oort
2004-07-01 12:58 pm
Может, это какая-то роковая ошибка в драйверной части cdrecord? Я не смотрел, что у cdrecord и cdrdao общего, но я уже лет 5 пишу диски с помощью cdrecord (cdrdao использовал только для того, чтобы записать снятый чем-то виндовым образ музыкального диска). Такого эффекта не было ни разу (драйв -- Mitsumi CR-4804TE).
(Ответить) (Thread)
From: vap
2004-07-01 01:35 pm
А удастся воспроизвести, если машину притормозить немного? Частоту процессора сделать пониже, тайминги памяти самые консервативные, устройство перевести в PIO-режим etc?
У меня были похожие симптомы, вылечилось заменой памяти.
(Ответить) (Thread)
From: selfmade
2004-07-01 03:00 pm
А время тратить не жалко? :)
(Ответить) (Thread)
[User Picture]From: evr
2004-07-02 12:11 am
А любопытство исследователя? :)
(Ответить) (Parent) (Thread)
[User Picture]From: garvej
2004-07-01 05:22 pm
Я сталкивался с похожей ошибкой.

С http-сервера, который работал под linux неправильно скачивались файлы. Ошибка тоже была в одном байте. Чаще всего менялся крайний бит байта, т.е., например, C2 превращался в C3. Иногда значение байта увеличивалось на 2. Но в одном большом файле такая ошибка могла встретиться в нескольких местах.

Адрес ошибочного байта был не любой, а подпадал под такую зависимость:
4096*N + k.
Если в 16-ричной системе записать, то будет просто 1000*N + k
Если значение байта увеличивалось на 1, то при этом было одно значение k, если увеличивалось на 2, то другое k.

А виноват оказался глючной модуль памяти на сервере.
После того, как его поменяли, ошибки исчезли.
(Ответить) (Thread)
[User Picture]From: a_konst
2004-07-02 01:58 am
позиции байтов не образуют арифметической прогрессии?
правда, не очень ясно, как считать :)
(Ответить) (Thread)
[User Picture]From: avva
2004-07-02 05:38 am
Не образуют ;)
(Ответить) (Parent) (Thread)
From: (Anonymous)
2004-07-02 02:00 am
У одного человека было такое. Оказалось, что один чип памяти плохой.
(Ответить) (Thread)
[User Picture]From: avva
2004-07-02 05:38 am
Тоже возможно, конечно...
(Ответить) (Parent) (Thread)
From: hml
2004-07-02 05:09 am
Примерно год (или полтора) назад я скачивал с сайта Oracle какие-то дистрибутивы по просьбе одного знакомого. Один из образов (~600 Mb) оказался битым (архив не распаковывался). Лезу в google, нахожу свежий архив переписки какого-то китайца (или индийца ? не помню) с саппортом Oracle по этой проблеме. Саппорт его всячески опустил и сказал, что такого не может быть. Скачиваю еще раз. Сбоит. Сверяю -- есть два отличия, в разных местах (сверял CRC32 блоков по 16K, собственной программкой). Скачиваю третий раз. Снова битый файл, но уже в другом месте ! Тогда, имея три варианта, я легко вычислил сбойные блоки и заменил их. Архив развернулся.
Бедный китаец :)
(Ответить) (Thread)
From: ex_alexkon
2004-07-02 09:23 am
Для проверки памяти можно запустить Memtest86+ на ночь или лучше на день — потому что жарче. Она может гонять кучу паттернов по многу раз и должна уметь находить разные странные глюки.
(Ответить) (Thread)