홈으로 돌아가기

GZIP .NET 오류: 접지 및 전원

이 기사는 접지 부족과 전압 강하로 인한 C# .NET의 불안정한 gzip 압축 해제 오류 사례를 분석합니다. 스택 추적, 하드웨어 증상, 진단 단계가 설명됩니다. 교훈: 코드 전에 전원 공급 확인.

고온에서 GZIP 실패: 접지 이야기
Advertisement 728x90

.NET GZIP 오류의 숨은 원인: 전원 공급 및 접지 문제

GZIP 아카이브를 읽는 C# 애플리케이션에서 "지원되지 않는 압축 메서드를 사용하여 아카이브 항목이 압축되었습니다."라는 메시지와 함께 InvalidDataException이 발생했습니다. 오류는 매우 간헐적이었습니다. 추출이 성공할 때도 있었지만, 갑자기 충돌할 때도 있었습니다. 파일 자체는 변경되지 않았고 체크섬도 완벽하게 일치했지만, 반복적인 읽기 시도 중 가끔 실패했습니다. 심지어 Bash에서도 "파일 설명자를 찾을 수 없습니다(can’t seek file descriptor)" 오류가 발생했습니다.

스택 추적은 System.IO.Compression.dll(.NET Core 3.1.16) 내의 DeflateStream.ReadCore를 직접 가리켰습니다. ReadCore 내부에서 if (count <= this._buffer.Length) 조건이 false로 평가되고 있었습니다. count가 버퍼 크기를 초과하는 방식으로 동작하여 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) // 여기서 조건이 false로 판정됨
        this._inflater.SetInput(this._buffer, 0, count);
      else
        break;
    } else
      goto label_7;
  }
  throw new InvalidDataException(SR.GenericInvalidData);
  label_7:
  return start;
}

호출 스택을 더 깊이 파고들면 ZLibNative.InflateDataError 또는 StreamError를 반환하고 있었는데, 런타임은 이를 손상된 데이터 또는 일관성 없는 스트림으로 해석한 것입니다.

Google AdInline article slot

하드웨어 고장 징후

문제는 곧 GZIP 추출을 넘어섰습니다. Visual Studio가 알 수 없는 오류로 충돌하며 복구 작업이 필요해졌고, 아이콘이 사라지거나 텍스트 렌더링이 일그러지는 현상이 발생했습니다. CrystalDiskInfo에서는 배드 섹터가 0개로 보고되었지만, sfc /scannow 명령어는 반복적으로 손상된 시스템 파일을 발견하고 "수정"했습니다.

결정적인 패턴은 전원 연결 시에만 오류가 발생한다는 것이었습니다. 배터리로 구동할 때는 시스템이 완벽하게 작동했습니다. 추가적인 증상은 다음과 같습니다.

  • 두 개의 다른 모니터에서 녹색 및 빨간색 시각적 아티팩트 발생.
  • 부트캠프(Boot Camp)를 실행 중인 MacBook Pro 2012의 트랙패드와 섀시를 만졌을 때 느껴지는 미세한 전기 감전.
  • 전원을 끈 후에도 아파트 형광등이 희미하게 빛나는 현상.
  • 애플리케이션 실행 지연 및 이유를 알 수 없는 임의의 시스템 종료.

Windows 이벤트 로그에는 전원 관리와 명시적으로 연결된 APIC 오류가 기록되고 있었습니다.

Google AdInline article slot

전기적 근본 원인 진단

간단한 콘센트 테스터로 벽면 소켓에 접지가 전혀 되어 있지 않음을 확인했습니다. 불안정성은 높은 습도, 주변 온도 상승, 에어컨 가동과 강한 상관관계를 보였습니다. 전압 강하(120V 미만으로 하락)는 AVR이 탑재된 UPS를 끊임없이 경고음으로 울리게 만들었고, 단 며칠 만에 20건 이상의 전원 이벤트를 기록했습니다.

기기를 GFCI(누전 차단기)가 설치된 콘센트(화장실)에 직접 연결하자 Prime95로 고부하를 걸어도 시스템이 일시적으로 안정화되었습니다. 다시 일반 멀티탭으로 전환하자마자 충돌 현상이 즉시 재발했습니다.

주요 원인 추정:

Google AdInline article slot
  • 접지선 부재: 전류가 흐를 경로가 없어 기기 섀시에 정전기가 축적됨.
  • 에어컨 가동에 의한 전압 강하: 무거운 컴프레서 작동 주기가 라인 전압을 끌어내림.
  • 높은 습도: 접지되지 않은 회로 간 전기 누설을 악화시킴.

해결 방안 및 핵심 교훈

온수기 접지 시스템과 본딩된 적절한 접지 콘센트를 설치하자 모든 증상이 완전히 사라졌습니다. 콘센트 테스터는 견고한 접지 연결을 확인해 주었습니다. GZIP 추출은 완전히 안정화되었고, 모니터 아티팩트는 사라졌으며, 전기 감전 현상도 멈췄습니다.

반드시 기억해야 할 사항:

  • DeflateStream에서 간헐적으로 발생하는 InvalidDataException 오류가 항상 파일 손상을 의미하는 것은 아닙니다. 하드웨어 수준의 읽기 실패를 나타낼 수 있습니다.
  • ReadCore에서 count > buffer.Length 조건이 발생하는 것은 하드웨어 수준에서 입력 스트림이 손상되었을 때 나타나는 전형적인 증상입니다.
  • 접지 부재는 금속 섀시에 전위차를 축적시켜 스토리지 드라이브 및 디스플레이 출력에 직접적인 간섭을 일으킵니다.
  • 전압 강하와 높은 습도의 결합은 배드 섹터 경고 없이도 조용한 데이터 손상을 유발할 수 있습니다.
  • 심층적인 코드 레벨 디버깅에 뛰어들기 전에 반드시 전원 및 접지 문제를 먼저 배제하십시오.

I/O 작업 디버깅은 IDE 너머를 바라보고 벽면 콘센트에 이르기까지 전체 물리적 체인을 고려해야 합니다.

— Editorial Team

Advertisement 728x90

다음 읽기