Błędy GZIP w .NET spowodowane problemami z zasilaniem i uziemieniem
Program w C# służący do odczytu archiwów gzip zwracał InvalidDataException z komunikatem „The archive entry was compressed using an unsupported compression method”. Błąd pojawiał się nieregularnie: czasem rozpakowanie kończyło się sukcesem, a innym razem aplikacja ulegała awarii. Pliki pozostawały niezmienione, sumy kontrolne się zgadzały, ale ponowne próby odczytu czasem kończyły się niepowodzeniem nawet w bashu z błędem „can’t seek file descriptor”.
Ślad stosu (stack trace) wskazywał na DeflateStream.ReadCore w System.IO.Compression.dll (.NET Core 3.1.16). W metodzie ReadCore warunek if (count <= this._buffer.Length) zwracał wartość false: count przekraczał rozmiar bufora, co skutkowało rzuceniem InvalidDataException.
internal int ReadCore(Span<byte> buffer) {
this.EnsureDecompressionMode();
this.EnsureNotDisposed();
this.EnsureBufferInitialized();
int start = 0;
while (true) {
do {
int num = this._inflater.Inflate(buffer.Slice(start));
start += num;
if (start == buffer.Length || this._inflater.Finished() && (!this._inflater.IsGzipStream() || !this._inflater.NeedsInput()))
goto label_7;
}
while (!this._inflater.NeedsInput());
int count = this._stream.Read(this._buffer, 0, this._buffer.Length);
if (count > 0) {
if (count <= this._buffer.Length) // tutaj warunek okazał się fałszywy
this._inflater.SetInput(this._buffer, 0, count);
else
break;
} else
goto label_7;
}
throw new InvalidDataException(SR.GenericInvalidData);
label_7:
return start;
}
Głębiej w stosie wywołań ZLibNative.Inflate zwracało DataError lub StreamError, co system interpretował jako uszkodzone dane lub niespójny strumień.
Objawy usterek sprzętowych
Problemy nie ograniczały się wyłącznie do plików gzip: Visual Studio losowo ulegała awariom, wymagając naprawy; ikony znikały, a tekst ulegał zniekształceniom. CrystalDiskInfo nie wykazywał uszkodzonych sektorów, ale sfc /scannow wielokrotnie znajdował i naprawiał pliki systemowe.
Kluczowy wzorzec: usterki pojawiały się wyłącznie przy zasilaniu z sieci, podczas gdy na baterii system działał stabilnie. Dodatkowe objawy:
- Zielono-czerwone artefakty na dwóch różnych monitorach.
- Uczucie mrowienia/porażenia prądem przy dotyku trackpada i obudowy MacBooka Pro 2012 (Boot Camp).
- Światło w mieszkaniu lekko rozświetlało się po wyłączeniu.
- Spowolnione uruchamianie aplikacji oraz losowe wyłączenia komputera.
Dziennik zdarzeń rejestrował błędy APIC powiązane z zasilaniem.
Diagnostyka problemów z instalacją elektryczną
Testy wykazały brak uziemienia w gniazdkach (potwierdzone prostym testerem). Problemy korelowały z wysoką wilgotnością, upałami oraz pracą klimatyzacji. Spadki napięcia (poniżej 120 V) powodowały pisk UPS-a z AVR, który odnotował ponad 20 incydentów w ciągu kilku dni.
Bezpośrednie podłączenie do gniazdka z wyłącznikiem różnicowoprądowym (RCD) w łazience tymczasowo ustabilizowało system pod obciążeniem Prime95. Powrót do listwy zasilającej natychmiast przywracał usterki.
Możliwe przyczyny:
- Brak uziemienia – prąd nie odpływał do ziemi, gromadząc się na obudowach urządzeń.
- Spadki napięcia wywoływane przez klimatyzację pracującą pod obciążeniem.
- Wysoka wilgotność nasilająca zjawisko upływności prądu.
Rozwiązanie i wnioski
Montaż nowego gniazdka z prawidłowym uziemieniem (poprowadzonym przez bojler) wyeliminował wszystkie objawy. Tester potwierdził poprawne uziemienie. Rozpakowywanie plików gzip ustabilizowało się, artefakty na monitorach zniknęły, a porażenia prądem ustały.
Co warto zapamiętać:
- Nieregularne wyjątki
InvalidDataExceptionwDeflateStreammogą wskazywać nie na uszkodzone dane, lecz na sprzętowe błędy odczytu. count > buffer.LengthwReadCoreto symptom zniekształcenia strumieni wejściowych.- Brak uziemienia powoduje gromadzenie się potencjału elektrycznego na obudowach, co wpływa na dyski HDD/SSD oraz monitory.
- Spadki napięcia w połączeniu z wilgocią prowadzą do korupcji danych bez pojawiania się bad sektorów.
- Zawsze weryfikuj stan instalacji elektrycznej przed przystąpieniem do głębokiego debugowania kodu.
Debugowanie operacji we/wy wymaga uwzględnienia czynników zewnętrznych: od środowiska IDE po gniazdko w ścianie.
— Editorial Team
Brak komentarzy.