Claude Code Exit Code 132 불법 명령어 오류 이해하기

Claude Code를 사용하다가 ‘exit code 132’라는 메시지를 본 적이 있나요? 이 에러는 상당히 특수한 경우에만 발생하는데, CPU가 이해할 수 없는 명령어를 실행하려고 할 때 발생합니다. 오늘은 이 exit code의 정확한 의미와 어떻게 해결할 수 있는지 알아보겠습니다.

컴퓨터의 CPU는 특정 기계어(machine code)만을 이해해요. 만약 CPU가 인식할 수 없는 명령어를 만나면, 프로세서가 예외를 발생시키고 운영체제가 이를 감지해서 프로세스를 종료시킵니다. Exit code 132는 이런 상황에서 나타나는 신호예요.

Exit Code 132의 의미

Exit code 132는 128 + 4를 의미해요. 이는 SIGILL(Illegal Instruction) 신호로 인한 프로세스 종료를 나타냅니다. ‘Illegal’은 ‘불법적인’ 또는 ‘비정상적인’이라는 뜻이고, ‘Instruction’은 CPU 명령어를 의미합니다.

SIGILL은 프로세서가 인식할 수 없는 명령어를 실행하려고 할 때 발생해요. 또는 CPU의 특정 기능(예: 벡터 명령어, 64비트 명령어 등)을 사용하려고 했는데 그 기능이 지원되지 않을 때도 발생할 수 있습니다.

CPU 아키텍처와 명령어

CPU는 제조사와 아키텍처에 따라 다른 명령어 세트를 지원해요. 예를 들어 Intel x86, ARM, MIPS 등은 각각 다른 명령어 세트를 가지고 있습니다. 또한 같은 아키텍처라도 버전에 따라 지원하는 명령어가 다를 수 있어요.

높은 성능을 위해 특정 CPU의 고급 명령어를 사용하는 프로그램이 있어요. 예를 들어 AVX(Advanced Vector Extensions)나 NEON(ARM 벡터 명령어) 같은 것들이 그렇습니다. 이런 명령어들을 지원하지 않는 CPU에서 프로그램을 실행하면 SIGILL이 발생합니다.

Claude Code에서의 Exit Code 132

Claude Code 환경에서 exit code 132가 발생하는 경우는 매우 드물어요. 보통 다음과 같은 상황에서 발생할 수 있습니다:

  • 특정 CPU 확장명령(SSE, AVX, NEON 등)을 사용하는 네이티브 바이너리 실행
  • 컴파일된 바이너리가 다른 CPU 아키텍처를 위해 만들어진 경우
  • 메모리 손상으로 인해 잘못된 코드가 실행되는 경우
  • 크로스 컴파일된 프로그램을 잘못된 플랫폼에서 실행
  • JIT(Just-In-Time) 컴파일러의 버그

바이너리 호환성

다른 컴퓨터에서 컴파일한 바이너리를 Claude Code 환경으로 옮겨서 실행하면 SIGILL이 발생할 수 있어요. 특히 고급 CPU 기능에 최적화된 바이너리의 경우 더욱 그렇습니다. 이를 해결하려면 Claude Code 환경의 CPU 특성에 맞게 다시 컴파일해야 합니다.

메모리 손상과 SIGILL

SIGILL은 또 다른 원인으로도 발생할 수 있어요. 바로 메모리 손상으로 인해 프로그램의 코드 영역이 덮어씌워지는 경우입니다. 이 경우 프로그램이 손상된 메모리를 명령어로 실행하려고 하면서 SIGILL이 발생하게 돼요.

예를 들어 버퍼 오버플로우(buffer overflow)로 인해 코드 영역이 손상되거나, 함수 포인터가 잘못된 주소를 가리키게 되면 이런 일이 발생할 수 있습니다. 이 경우 SIGILL이 나타날 수도 있고, segmentation fault나 다른 오류가 나타날 수도 있어요.

디버깅 관점에서의 메모리 손상

메모리 손상은 매우 찾기 어려운 버그예요. 문제가 발생한 지점과 실제 원인 지점이 멀리 떨어져 있을 수 있거든요. 메모리 손상으로 인한 SIGILL을 의심한다면, 메모리 검사 도구를 사용해야 합니다.

컴파일 최적화와 호환성

C나 C++ 프로그램을 컴파일할 때, -march 옵션으로 특정 CPU를 대상으로 컴파일할 수 있어요. 예를 들어 ‘-march=native’는 현재 CPU의 모든 기능을 사용하도록 컴파일합니다. 이렇게 컴파일한 프로그램을 다른 CPU 환경으로 옮기면 SIGILL이 발생할 수 있어요.

호환성을 유지하려면 기본 설정으로 컴파일하거나, 더 보수적인 -march 옵션을 사용해야 합니다. 예를 들어 ‘-march=x86-64’는 기본적인 x86-64 명령어만 사용하도록 제한합니다.

컴파일 옵션 조정

Claude Code에서 exit code 132가 발생했다면, 컴파일 옵션을 확인해보세요. 만약 네이티브 바이너리를 사용한다면:

  • -O3 같은 높은 최적화 레벨에서 -O2로 낮추기
  • -march=native에서 -march=x86-64로 변경
  • -ffast-math 같은 숨겨진 최적화 옵션 확인
  • SSE, AVX 같은 확장명령 직접 사용 코드 제거

Python과 확장 모듈

Python 프로그램에서도 exit code 132가 발생할 수 있어요. 특히 C 확장 모듈(예: numpy, scipy, tensorflow 등)을 사용할 때 이런 일이 발생할 수 있습니다. 이런 라이브러리들은 성능을 위해 벡터 명령어를 직접 사용하기도 하거든요.

Python 확장 모듈에서 SIGILL이 발생하면, 그 모듈의 버전이나 설치 방식을 확인해야 합니다. 특히 다른 컴퓨터에서 만든 바이너리 휠(wheel) 파일을 사용하는 경우, CPU 호환성 문제가 있을 수 있어요.

numpy 같은 과학 계산 라이브러리

numpy는 고속 계산을 위해 벡터 명령어를 많이 사용해요. 만약 numpy가 특정 CPU 기능을 요구하는데 Claude Code 환경이 그것을 지원하지 않으면 SIGILL이 발생할 수 있습니다. 이 경우 환경 변수를 설정해서 벡터 명령어 사용을 제한할 수 있어요.

Java와 JIT 컴파일러

Java 프로그램의 경우 JIT(Just-In-Time) 컴파일러가 바이트코드를 네이티브 코드로 변환합니다. JIT 컴파일러의 버그로 인해 불법 명령어를 생성할 수도 있어요. 이 경우 다음과 같은 방법을 시도해볼 수 있습니다:

  • JVM 버전 업그레이드
  • JIT 컴파일러 비활성화 (-Xint 옵션)
  • 특정 최적화 옵션 비활성화

JVM 옵션 조정

‘-Xint’ 옵션으로 JIT 컴파일을 비활성화하면 속도는 느려지지만 SIGILL을 피할 수 있어요. 또한 ‘-XX:+TieredCompilation’ 같은 옵션으로 컴파일 방식을 변경할 수 있습니다.

문제 진단과 해결

Exit code 132가 발생했을 때 원인을 파악하기 위해서는:

  • file 명령으로 바이너리의 CPU 아키텍처 확인
  • readelf나 objdump로 어떤 명령어가 사용되었는지 확인
  • gdb 디버거로 어디서 문제가 발생하는지 추적
  • 프로그램을 다시 컴파일해서 테스트
  • 환경 변수로 확장명령 사용 제한

gdb를 이용한 디버깅

gdb 디버거를 사용하면 프로그램이 어느 지점에서 SIGILL을 받는지 정확히 알 수 있어요. backtrace 명령으로 호출 스택을 확인하면 문제 함수를 찾을 수 있습니다.

해결 전략

Exit code 132를 해결하기 위한 우선순위는 다음과 같아요:

첫째, 네이티브 바이너리를 사용한다면 Claude Code 환경에 맞게 다시 컴파일하세요. 특히 컴파일 옵션에 -march=native가 있다면 제거하거나 변경해야 합니다.

둘째, Python 확장 모듈의 경우 호환되는 버전을 설치하거나 소스에서 다시 컴파일하세요.

셋째, 메모리 손상의 가능성이 있다면, Valgrind나 AddressSanitizer 같은 도구를 사용해서 검사해보세요.

결론 및 예방

Exit code 132는 매우 특수한 경우에만 발생하는 에러예요. 대부분은 CPU 호환성이나 컴파일 최적화로 인한 문제입니다. Claude Code에서 이 에러가 발생했다면, 먼저 사용 중인 바이너리나 라이브러리의 호환성을 확인하세요.

특히 다른 환경에서 만든 바이너리나 패키지를 사용할 때는 호환성에 주의해야 해요. 가능하면 Claude Code 환경에서 직접 컴파일하거나, 호환되는 버전을 사용하는 것이 가장 안전합니다. 이렇게 하면 대부분의 SIGILL 문제를 예방할 수 있을 거예요.