Zpět na domů

GZIP chyby .NET: uzemnění a napájení

Článek rozebírá případ nestabilních chyb gzip-rozbalování v C# .NET způsobených absencí uzemnění a propady napětí. Jsou popsány stack trace, symptomy na hardware a kroky diagnostiky. Lekce: kontrolujte elektrické napájení před kódem.

GZIP selhává v horku: příběh s uzemněním
Advertisement 728x90

Chyby GZIP v .NET způsobené problémy s napájením a uzemněním

C# aplikace určená pro čtení archivů gzip vyhazovala InvalidDataException s hláškem „The archive entry was compressed using an unsupported compression method“. Chyba se projevovala nestabilně: někdy se archiv úspěšně rozbalil, jindy aplikace spadla. Soubory se neměnily, kontrolní součty souhlasily, ale opakované pokusy o čtení někdy selhaly i v prostředí bash s chybou „can’t seek file descriptor“.

Trasování zásobníku (stack trace) ukazovalo na metodu DeflateStream.ReadCore v knihovně System.IO.Compression.dll (.NET Core 3.1.16). Uvnitř ReadCore podmínka if (count <= this._buffer.Length) vracela false: hodnota count překračovala velikost vyrovnávací paměti, což vedlo k vyvolání 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) // zde podmínka vrátila false
        this._inflater.SetInput(this._buffer, 0, count);
      else
        break;
    } else
      goto label_7;
  }
  throw new InvalidDataException(SR.GenericInvalidData);
  label_7:
  return start;
}

Hlouběji v zásobníku vracela funkce ZLibNative.Inflate chyby DataError nebo StreamError, což systém interpretoval jako poškozená data nebo nekonzistentní datový proud.

Google AdInline article slot

Příznaky hardwarových závad

Problémy se neomezovaly pouze na gzip: Visual Studio padala s občasnými chybami vyžadujícími opravu, ikony mizely a text se zobrazoval zkresleně. Nástroj CrystalDiskInfo sice nehlásil žádné vadné sektory, ale příkaz sfc /scannow opakovaně nacházel a opravoval systémové soubory.

Klíčový vzorec: k chybám docházelo pouze při napájení ze sítě, na baterii systém fungoval stabilně. Dále se objevovaly následující jevy:

  • Zeleno-červené grafické artefakty na dvou různých monitorech.
  • Pocit brnění od statické elektřiny při dotyku trackpadu a šasi MacBooku Pro 2012 (Boot Camp).
  • Světla v bytě po vypnutí slabě dohořívala nebo blikala.
  • Zpomalené spouštění aplikací a náhodné vypínání systému.

Systémový protokol (Event Viewer) zaznamenával chyby APIC související s napájením.

Google AdInline article slot

Diagnostika elektrických problémů

Testování odhalilo chybějící uzemnění v elektrických zásuvkách (ověřeno jednoduchým testerem). Problémy korelovaly s vysokou vlhkostí, horkem a provozem klimatizace. Poklesy napětí (pod 120 V) způsobovaly pískání UPS s AVR, přičemž během několika dnů bylo zaznamenáno přes 20 incidentů.

Přímé zapojení do zásuvky s proudovým chráničem (v koupelně) systém dočasně stabilizovalo i pod zátěží Prime95. Jakmile se vrátilo připojení přes síťový filtr, chyby se znovu objevily.

Možné příčiny:

Google AdInline article slot
  • Chybějící uzemnění – elektrický proud neodcházel do země, ale hromadil se na kovových částech zařízení.
  • Poklesy napětí způsobené zapínáním klimatizace pod zátěží.
  • Vysoká vlhkost vzduchu zhoršovala svodové proudy.

Řešení a poučení

Instalace nové zásuvky s funkčním uzemněním (vyvedeným přes bojler) odstranila všechny příznaky. Tester potvrdil správné uzemnění. Rozbalování gzip archivů se stabilizovalo, grafické artefakty na monitorech zmizely a pocit brnění při dotyku přestal.

Na co si dát pozor:

  • Nestabilní výskyt InvalidDataException v DeflateStream nemusí znamenat poškozená data, ale může jít o hardwarovou chybu při čtení.
  • Podmínka count > buffer.Length v metodě ReadCore je příznakem narušeného vstupního datového proudu.
  • Chybějící uzemnění vede k hromadění elektrického potenciálu na šasi, což ovlivňuje funkčnost HDD/SSD i monitorů.
  • Poklesy napětí v kombinaci s vysokou vlhkostí = poškození dat bez výskytu vadných sektorů.
  • Před zahájením hloubkové analýzy kódu vždy zkontrolujte kvalitu elektrického napájení.

Ladění I/O operací vyžaduje zohlednění vnějších faktorů: od vývojového prostředí až po elektrickou zásuvku.

— Editorial Team

Advertisement 728x90

Číst dál