구글이 없으면 개발을 할 수 없다고 생각합니다. 구글링으로 해결하지 못한 문제는 거의 없었던 것 같네요. 아쉽게도 모국어로 된 정보들이 많이 부족합니다. 이것이 제가 더 열심히 블로그를 써야 하는 이유입니다.
오늘 다루고자 하는 내용은 gcc로 컴파일 도중에 "internal compiler error: killed (program cc1)"이라는 메시지가 나오면서 컴파일이 종료되는 문제점의 해결 방법에 대해서 설명하고자 합니다.
[문제의 상황]
오늘 아침 제가 진행하고 있는 프로젝트를 빌드했더니 갑자기 아래와 같은 컴파일 에러 메시지가 발생하면서 빌드가 중단되었습니다.
arm-none-eabi-gcc: internal compiler error: Killed (program cc1)
Please submit a full bug report,
with preprocessed source if appropriate.
See <https://gcc.gnu.org/bugs/> for instructions.
해야 할 일들이 많이 쌓여있는데, 빌드 에러가 발생하면 제법 성가실 수밖에 없을 것 같습니다. 왜 그런지 상황을 하나씩 파악해보겠습니다.
[Check Point 1. 소스코드 확인]
컴파일 에러가 발생하면 누구든 가장 먼저 소스코드를 확인해볼 것입니다. 소스코드를 잘못 작성해서 컴파일 에러가 발생하는 것일 수도 있을 테니까요. 제가 진행하고 있는 프로젝트는 github로 형상관리를 하는데, Jenkins와 연동되어있어 컴파일 에러가 발생하는 소스 코드가 master에 merge 될 수 없는 상황입니다. 다른 동료들에게도 물어보고, 다른 PC에서도 빌드해봤지만 모두 이상 없이 빌드가 이뤄졌습니다. 발생하는 위치 또한 random 했기 때문에 직감적으로 개발 환경의 문제라는 생각이 들더군요.
[Check Point 2. dmesg 명령을 통해 로그 확인]
dmesg 명령을 통해서 로그를 확인해보니 아래와 같이, Out of memory 에러가 발생하여 cc1 프로세스가 강제로 종료된 것이었습니다.
[ 242.240695] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/docker/d230dd04eeb69d1810ea0b00e7c23be3112d0eaf44427d2c8c4b64fc1cab9de8,task=cc1,pid=15421,uid=1000
[ 242.240719] Out of memory: Killed process 15421 (cc1) total-vm:1098880kB, anon-rss:428320kB, file-rss:0kB, shmem-rss:0kB, UID:1000 pgtables:1848kB oom_score_adj:0
[ 242.306243] oom_reaper: reaped process 15421 (cc1), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
[ 243.733096] docker0: port 1(veth28a94f7) entered disabled state
[ 243.734621] vethdf61533: renamed from eth0
[ 243.824508] docker0: port 1(veth28a94f7) entered disabled state
[ 243.827093] device veth28a94f7 left promiscuous mode
[ 243.827098] docker0: port 1(veth28a94f7) entered disabled state
빌드 에러가 발생한 이유는 메모리가 부족해서였던 것입니다. 위의 에러 메시지에서 "Out of memory: Killed process 15421"이라는 메시지에 그렇게 나와있습니다. 그렇다면 RAM을 증설해야 하는 걸까요? 실제 PC에서 이런 문제가 발생했다면 RAM을 증설하는 것도 한 가지 방법이 될 수 있겠습니다.
하지만 저는 vmware와 docker를 이용하는 환경입니다. 지금 문제가 발생하는 PC에서도 이전 VMware 이미지에서는 잘 동작했기 때문에 Host PC의 RAM 부족 문제는 아닐 거라고 생각했습니다.
[Check Point 3. 가상 머신 설정 체크]
이 문제의 발단을 곰곰이 생각해보니, 제가 VMware 이미지를 새로 생성했기 때문이라는 의심이 들더군요. 이전 VMware 이미지에서 엄청난 용량의 vdmk 파일들이 계속 생성되는 문제가 있어서 최근에 VMware 이미지를 새로 생성했기 때문입니다. 전체 용량이 200GB 정도 육박하는 vmdk 파일이 생성되어 어쩔 수 없이 기존 이미지를 지우고 새로 생성할 수밖에 없었습니다.
가상 머신으로 돌고 있는 Ubuntu Linux를 종료하고, virtual machine settings를 확인해보니 RAM 용량이 1GB에 불과합니다. VMware 이미지를 생성할 때 Recommended memory가 1GB라서 그대로 뒀는데, Memory 용량을 2GB로 늘려줬습니다.
[문제의 해결]
Memory 용량을 1GB에서 2GB로 변경한 이후에 다시 빌드를 해봤더니 문제가 깔끔하게 해결되었습니다. 여러분들도 만약 빌드 도중 "internal compiler error: killed (program cc1)" 에러가 발생한다면 dmesg 명령을 통해서 메모리가 부족한 상황은 아닌지 파악하시고, 혹시 가상 머신 환경이라면 Memory 용량을 늘려보시기 바랍니다.
이상입니다.