Воспроизвести java .io.IOException: Ошибка данных (CR C) - PullRequest
0 голосов
/ 03 апреля 2020

У нас есть приложение, использующее update4j, и мы получили сообщение об ошибке от пользователя Windows со следующей трассировкой стека:

INFO [main]   (OurMain.java:70) - Fatal error details: A problem occurred during the update
com.example.updater.RuntimeFatalError: A problem occured during the update
    at com.example.updater.Updater.update(Updater.java:72)
    ...
Caused by: com.example.updater.RuntimeFatalError: A problem occurred during the update
    at com.example.updater.UpdateHandler.failed(UpdateHandler.java:78)
    at org.update4j.Configuration.updateImpl(Configuration.java:1048)
    at org.update4j.Configuration.update(Configuration.java:861)
    at org.update4j.Configuration.update(Configuration.java:845)
    at com.example.updater.Updater.update(Updater.java:70)
    ... 1 common frames omitted
Caused by: java.io.IOException: Adathiba (CRC)
    at java.base/sun.nio.ch.FileDispatcherImpl.read0(Native Method)
    at java.base/sun.nio.ch.FileDispatcherImpl.read(FileDispatcherImpl.java:54)
    at java.base/sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:276)
    at java.base/sun.nio.ch.IOUtil.read(IOUtil.java:245)
    at java.base/sun.nio.ch.FileChannelImpl.read(FileChannelImpl.java:223)
    at java.base/sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:65)
    at java.base/sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:109)
    at java.base/sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:103)
    at org.update4j.util.FileUtils.getChecksum(FileUtils.java:57)
    at org.update4j.FileMetadata.requiresUpdate(FileMetadata.java:371)
    at org.update4j.Configuration.updateImpl(Configuration.java:934)
    ... 4 common frames omitted

(я думаю, что сообщение "Adathiba (CR C)" будет «Ошибка данных (CR C)» с языком Engli sh.)

Если я прав, update4j пытается прочитать файл jar с диска здесь.

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

Я попытался создать неверный входной файл zip / jar, но update4j обнаружил, что его контрольная сумма не совпадает с контрольной суммой в его файле XML, и загрузил и заменил файл (как и ожидалось).

Любая ссылка на соответствующий источник OpenJDK (13, 14) можно только приветствовать. Я проверил FileDispatcherImpl.java и FileDispatcherImpl.c, но я не нашел ничего, связанного с проверками или ошибками CR C.

Итак, вот мои вопросы:

  • В каком случае может ли JVM генерировать этот тип IOException?
  • Указывает ли это на поврежденный файл ZIP / JAR? Если да, то как создать файл, вызывающий аналогичное исключение (для тестирования)?
  • Указывает ли это на неисправный жесткий диск (и ошибка произошла от ОС)?

1 Ответ

0 голосов
/ 06 апреля 2020

Как упомянул @vbezhenar в своем комментарии, это похоже на сообщение об ошибке родной ОС. Я не знаком с кодом JDK, поэтому примите мой (частичный) ответ с осторожностью.

FileDispatcherImpl.read0(Native Method) (из стековой трассировки) является нативным методом:

static native int read0(FileDescriptor fd, long address, int len)
    throws IOException;

Он реализован в исходном файле FileDispatcherImpl.c , где, если я прав, инструкция

return convertReturnVal(env, (jint)read, JNI_TRUE);

выдает исключение, приведенное выше.

convertReturnVal() реализовано в IOUtil.c файл . Он вызывает другой метод:

JNU_ThrowIOExceptionWithLastError(env, "Read/write failed");

Он реализован в файле jni_util.c, а второй параметр называется defaultDetail. Он вызывает JNU_ThrowByNameWithLastError(), который анализирует только результат ReadFile() (вызывается с read0()). Так как значение defaultDetail (Read/write failed) не отображается в трассировке стека вопроса, я полагаю, сообщение приходит из ОС.

...