Volver al inicio

Errores de GZIP en .NET: Puesta a tierra y Alimentación

El artículo analiza un caso de errores inestables de descompresión gzip en C# .NET causados por falta de puesta a tierra y caídas de voltaje. Stack traces, síntomas de hardware y pasos de diagnóstico se describen. Lección: verificar fuente de alimentación antes del código.

GZIP Falla en Calor: Historia con Puesta a tierra
Advertisement 728x90

Errores de GZIP en .NET causados por problemas de alimentación y puesta a tierra

Una aplicación en C# que leía archivos GZIP lanzaba una InvalidDataException con el mensaje "The archive entry was compressed using an unsupported compression method." El error era muy intermitente: a veces la extracción funcionaba, otras veces la aplicación se cerraba inesperadamente. Los archivos nunca cambiaban, las sumas de verificación coincidían perfectamente y, sin embargo, los intentos repetidos de lectura fallaban ocasionalmente, incluso en Bash, que arrojaba un error de "can’t seek file descriptor".

El seguimiento de pila apuntaba directamente a DeflateStream.ReadCore en System.IO.Compression.dll (.NET Core 3.1.16). Dentro de ReadCore, la condición if (count <= this._buffer.Length) se evaluaba como false: count superaba misteriosamente el tamaño del búfer, lo que desencadenaba la 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) // aquí la condición resultó ser false
        this._inflater.SetInput(this._buffer, 0, count);
      else
        break;
    } else
      goto label_7;
  }
  throw new InvalidDataException(SR.GenericInvalidData);
  label_7:
  return start;
}

Más abajo en la pila de llamadas, ZLibNative.Inflate devolvía DataError o StreamError, lo que el entorno de ejecución interpretaba como datos corruptos o un flujo inconsistente.

Google AdInline article slot

Síntomas de fallo de hardware

Los problemas pronto se extendieron más allá de la extracción de archivos GZIP. Visual Studio comenzó a cerrarse con errores crípticos que requerían reparaciones, los iconos desaparecían y la representación de texto se distorsionaba. CrystalDiskInfo no reportaba sectores defectuosos, pero sfc /scannow encontraba y "reparaba" repetidamente archivos del sistema dañados.

El patrón crítico surgió claramente: los fallos solo ocurrían cuando el equipo estaba conectado a la corriente alterna. Con la batería, el sistema funcionaba a la perfección. Otros síntomas adicionales incluían:

  • Artefactos visuales verdes y rojos en dos monitores distintos.
  • Una leve sensación de hormigueo eléctrico al tocar el panel táctil y el chasis de un MacBook Pro 2012 (ejecutando Boot Camp).
  • Las luces del apartamento brillaban tenuemente incluso después de apagarlas.
  • Lanzamiento lento de aplicaciones y apagados aleatorios e inexplicables.

El Registro de eventos de Windows registraba errores de APIC explícitamente vinculados a la gestión de energía.

Google AdInline article slot

Diagnóstico de la causa raíz eléctrica

Un comprobador de enchufes sencillo confirmó la ausencia total de puesta a tierra en las tomas de corriente. La inestabilidad se correlacionaba fuertemente con la alta humedad, el calor ambiental y el funcionamiento del aire acondicionado. Las caídas de tensión (por debajo de 120 V) activaban constantemente el SAI (UPS) con AVR, registrando más de 20 eventos de energía en solo unos días.

Conectar el equipo directamente a un enchufe protegido por interruptor diferencial (GFCI) (en el baño) estabilizó temporalmente el sistema, incluso bajo una carga pesada con Prime95. Volver a conectarlo a la regleta de corriente estándar provocó el regreso inmediato de los cierres inesperados.

Causas probables:

Google AdInline article slot
  • Falta de cable de tierra: La corriente eléctrica no tenía por dónde disiparse, lo que provocaba una acumulación de electricidad estática en el chasis de los dispositivos.
  • Caídas de tensión por la unidad de aire acondicionado: Los ciclos pesados del compresor reducían la tensión de la línea.
  • Alta humedad: Agravaba las fugas eléctricas en circuitos sin conexión a tierra.

Solución y conclusiones clave

Instalar un enchufe correctamente conectado a tierra (vinculado al sistema de puesta a tierra del calentador de agua) eliminó por completo todos los síntomas. El comprobador confirmó una conexión a tierra sólida. La extracción de archivos GZIP se estabilizó por completo, desaparecieron los artefactos en el monitor y cesaron las descargas eléctricas.

Qué tener en cuenta:

  • Los errores intermitentes de InvalidDataException en DeflateStream no siempre indican archivos corruptos; pueden señalar fallos de lectura a nivel de hardware.
  • Una condición count > buffer.Length en ReadCore es un síntoma clásico de corrupción del flujo de entrada a nivel de hardware.
  • La falta de puesta a tierra provoca que se acumule potencial eléctrico en los chasis metálicos, lo que interfiere directamente con las unidades de almacenamiento y las salidas de vídeo.
  • Las caídas de tensión combinadas con alta humedad pueden causar corrupción silenciosa de datos sin activar advertencias de sectores defectuosos.
  • Siempre descarta primero los problemas de alimentación y puesta a tierra antes de sumergirte en una depuración profunda a nivel de código.

La depuración de operaciones de E/S exige mirar más allá del IDE y considerar toda la cadena física, hasta la toma de corriente de la pared.

— Editorial Team

Advertisement 728x90

Leer después