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.
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.
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:
- 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
InvalidDataExceptionvDeflateStreamnemusí znamenat poškozená data, ale může jít o hardwarovou chybu při čtení. - Podmínka
count > buffer.Lengthv metoděReadCoreje 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
Zatím žádné komentáře.