Powrót do strony głównej

Błędy GZIP .NET: uziemienie i zasilanie

Artykuł analizuje przypadek niestabilnych błędów dekompresji gzip w C# .NET spowodowanych brakiem uziemienia i spadkami napięcia. Opisane stack trace, objawy na hardware i kroki diagnostyki. Lekcja: sprawdzaj zasilanie przed kodem.

GZIP pada w upale: historia z uziemieniem
Advertisement 728x90

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ń.

Google AdInline article slot

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.

Google AdInline article slot

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:

Google AdInline article slot
  • 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 InvalidDataException w DeflateStream mogą wskazywać nie na uszkodzone dane, lecz na sprzętowe błędy odczytu.
  • count > buffer.Length w ReadCore to 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

Advertisement 728x90

Czytaj dalej