Retour à l'accueil

Erreurs GZIP .NET : Mise à la terre et Alimentation

L'article analyse un cas d'erreurs instables de décompression gzip en C# .NET causées par un manque de mise à la terre et des chutes de tension. Traces de pile, symptômes matériels et étapes de diagnostic sont décrits. Leçon : vérifiez l'alimentation avant le code.

GZIP Échoue dans la Chaleur : Histoire avec Mise à la terre
Advertisement 728x90

Erreurs GZIP .NET causées par des problèmes d'alimentation et de mise à la terre

Une application C# chargée de lire des archives GZIP levait une InvalidDataException avec le message « L'entrée de l'archive a été compressée à l'aide d'une méthode de compression non prise en charge. » L'erreur était hautement intermittente : l'extraction fonctionnait parfois, mais plantait à d'autres moments. Les fichiers eux-mêmes ne changeaient jamais, les sommes de contrôle correspondaient parfaitement, et pourtant, des tentatives de lecture répétées échouaient occasionnellement, même sous Bash, avec une erreur « impossible de déplacer le descripteur de fichier » (can't seek file descriptor).

La trace de la pile d'exécution pointait directement vers DeflateStream.ReadCore dans System.IO.Compression.dll (.NET Core 3.1.16). À l'intérieur de ReadCore, la condition if (count <= this._buffer.Length) évaluait à false : la valeur count dépassait inexplicablement la taille du tampon, déclenchant ainsi l'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) // ici, la condition s'est avérée fausse
        this._inflater.SetInput(this._buffer, 0, count);
      else
        break;
    } else
      goto label_7;
  }
  throw new InvalidDataException(SR.GenericInvalidData);
  label_7:
  return start;
}

Plus bas dans la pile d'appels, ZLibNative.Inflate renvoyait DataError ou StreamError, ce que le runtime interprétait comme des données corrompues ou un flux incohérent.

Google AdInline article slot

Symptômes de défaillance matérielle

Les problèmes ont rapidement dépassé le cadre de l'extraction GZIP. Visual Studio s'est mis à planter avec des erreurs obscures nécessitant des réparations, des icônes disparaissaient et le rendu du texte se déformait. CrystalDiskInfo indiquait zéro secteur défectueux, mais sfc /scannow détectait et « réparait » continuellement des fichiers système corrompus.

Le schéma critique est apparu clairement : les pannes ne survenaient que lorsque l'ordinateur était branché sur le secteur. Sur batterie, le système fonctionnait sans faille. Parmi les symptômes supplémentaires :

  • Des artefacts visuels verts et rouges sur deux écrans différents.
  • Une sensation de picotement électrique notable en touchant le trackpad et le châssis d'un MacBook Pro 2012 (sous Boot Camp).
  • Des ampoules d'appartement qui continuaient de faiblement luire après avoir été éteintes.
  • Des lancements d'applications lents et des arrêts aléatoires et inexpliqués.

Le journal des événements Windows enregistrait des erreurs APIC explicitement liées à la gestion de l'alimentation.

Google AdInline article slot

Diagnostic de la cause racine électrique

Un simple testeur de prise a confirmé l'absence totale de mise à la terre sur les prises murales. L'instabilité était fortement corrélée à une humidité élevée, à la chaleur ambiante et au fonctionnement de la climatisation. Des chutes de tension (descendant sous les 120 V) déclenchaient des bips constants sur l'onduleur avec AVR, qui a enregistré plus de 20 événements électriques en seulement quelques jours.

Brancher la machine directement sur une prise protégée par un disjoncteur différentiel (dans la salle de bain) a temporairement stabilisé le système, même sous une charge lourde avec Prime95. Rebrancher sur une multiprise standard a immédiatement fait réapparaître les plantages.

Causes probables :

Google AdInline article slot
  • Absence de fil de terre : Le courant électrique n'avait nulle part où se dissiper, provoquant une accumulation d'électricité statique sur les châssis des appareils.
  • Chutes de tension dues au climatiseur : Les cycles lourds du compresseur tiraient la tension de la ligne vers le bas.
  • Humidité élevée : Elle exacerbait les fuites électriques sur les circuits non mis à la terre.

Résolution et enseignements clés

L'installation d'une prise correctement mise à la terre (reliée au système de mise à la terre du chauffe-eau) a éliminé chaque symptôme. Le testeur de prise a confirmé une connexion de terre solide. L'extraction GZIP s'est complètement stabilisée, les artefacts sur les écrans ont disparu et les décharges électriques ont cessé.

Ce qu'il faut retenir :

  • Les erreurs InvalidDataException intermittentes dans DeflateStream ne signifient pas toujours que les fichiers sont corrompus ; elles peuvent indiquer des échecs de lecture au niveau matériel.
  • Une condition count > buffer.Length dans ReadCore est un symptôme classique de corruption du flux d'entrée au niveau matériel.
  • Une mise à la terre manquante entraîne une accumulation de potentiel électrique sur les châssis métalliques, interférant directement avec les disques de stockage et les sorties vidéo.
  • Les chutes de tension combinées à une forte humidité peuvent provoquer une corruption silencieuse des données sans déclencher d'alertes de secteurs défectueux.
  • Écartez toujours les problèmes d'alimentation et de mise à la terre avant de plonger dans un débogage approfondi au niveau du code.

Le débogage des opérations d'E/S exige de regarder au-delà de l'EDI et de considérer l'ensemble de la chaîne physique, jusqu'à la prise murale.

— Editorial Team

Advertisement 728x90

Lire ensuite