Linux 서버에서 프로그램을 실행하다 보면 갑자기 Segmentation fault 또는 Segmentation fault (core dumped)라는 오류가 발생하며 프로그램이 종료되는 경우가 있습니다. 이 오류는 메모리 접근과 관련된 대표적인 런타임(Runtime) 오류로, C/C++ 프로그램뿐만 아니라 Python, Java, PHP, Node.js 등에서도 내부 라이브러리 문제로 발생할 수 있습니다.
특히 운영 중인 서버에서 자주 발생한다면 애플리케이션 버그뿐 아니라 메모리 손상, 라이브러리 충돌, 하드웨어 문제까지 함께 의심해야 합니다. 이번 글에서는 Segmentation fault 오류의 원인과 실무에서 확인하는 방법을 알아보겠습니다.
Segmentation fault란 무엇인가?
Segmentation fault(세그멘테이션 폴트)는 프로그램이 접근해서는 안 되는 메모리 영역에 접근했을 때 운영체제가 강제로 프로그램을 종료시키는 오류입니다.
대표적인 오류 예시는 다음과 같습니다.
Segmentation fault
또는
Segmentation fault (core dumped)
프로그램이 비정상 종료되면서 코어 덤프(Core Dump)가 생성되기도 합니다.
Segmentation fault가 발생하는 대표적인 원인
다음과 같은 경우에 자주 발생합니다.
- NULL 포인터 접근
- 초기화되지 않은 변수 사용
- 배열 범위 초과
- 메모리 해제 후 접근(Use After Free)
- 라이브러리 충돌
- 잘못된 포인터 연산
- 메모리 손상
- CPU 또는 RAM 하드웨어 오류
- 오래된 바이너리 실행
- 컴파일 옵션 문제
프로그램 코드뿐 아니라 시스템 환경도 함께 확인해야 합니다.
1. 시스템 로그 확인하기
먼저 커널 로그를 확인합니다.
dmesg | tail -30
Segmentation fault 관련 메시지가 기록되어 있는지 확인합니다.
또는
journalctl -xe
애플리케이션 종료 원인을 확인할 수 있습니다.
2. Core Dump 생성 여부 확인하기
현재 Core Dump 설정을 확인합니다.
ulimit -c
결과가
0
이라면 Core Dump가 비활성화된 상태입니다.
활성화하려면
ulimit -c unlimited
를 실행합니다.
3. Core Dump 위치 확인하기
Core Dump 저장 위치를 확인합니다.
cat /proc/sys/kernel/core_pattern
시스템마다 저장 위치가 다를 수 있습니다.
4. GDB로 분석하기
Core Dump가 생성되었다면 GDB로 분석합니다.
gdb 프로그램명 core
대표적으로 사용하는 명령은 다음과 같습니다.
bt
Stack Trace를 확인할 수 있습니다.
5. 공유 라이브러리 확인하기
라이브러리 충돌 여부를 확인합니다.
ldd 프로그램명
누락되거나 잘못된 라이브러리가 있는지 확인합니다.
6. 메모리 사용량 확인하기
메모리가 부족하거나 손상되었는지 확인합니다.
free -h
또는
vmstat 1
메모리 부족과 Swap 사용량도 함께 확인합니다.
7. 실행 파일 확인하기
실행 파일이 손상되었는지 확인합니다.
file 프로그램명
필요하다면 다시 설치하거나 다시 컴파일합니다.
8. 패키지 무결성 확인하기
패키지가 손상되었는지 확인합니다.
Ubuntu
dpkg -V
CentOS / Rocky Linux
rpm -Va
9. 메모리 오류 확인하기
RAM 이상이 의심된다면 메모리 테스트를 진행합니다.
memtester 1024M
또는 서버 재부팅 후 MemTest86으로 검사하는 것이 좋습니다.
10. 최근 변경 사항 확인하기
오류가 업데이트 이후 발생했다면 최근 변경 사항을 확인합니다.
- 라이브러리 업데이트
- 커널 업데이트
- 프로그램 재배포
- 환경 변수 변경
- 컴파일 옵션 변경
변경 이력을 추적하면 원인을 빠르게 찾을 수 있습니다.
Segmentation fault 문제를 확인하는 순서
실무에서는 다음 순서대로 확인하는 것이 가장 효율적입니다.
- dmesg 확인
- journalctl 확인
- Core Dump 활성화 확인
- Core Dump 분석
- GDB Stack Trace 확인
- ldd 확인
- free -h 확인
- 실행 파일 무결성 확인
- 메모리 검사
- 최근 변경 사항 확인
이 순서대로 확인하면 대부분의 원인을 빠르게 파악할 수 있습니다.
오류를 해결할 때 주의할 점
Segmentation fault는 단순히 프로그램을 다시 실행한다고 해결되는 오류가 아닙니다.
동일한 코드에서 반복 발생한다면 프로그램 자체의 버그일 가능성이 높으며, Core Dump와 Stack Trace를 분석해야 정확한 원인을 찾을 수 있습니다.
또한 운영 서버에서는 Core Dump 파일의 크기가 매우 커질 수 있으므로 저장 공간도 함께 고려해야 합니다.
자주 묻는 질문
Segmentation fault는 운영체제 문제인가요?
대부분은 애플리케이션 코드나 라이브러리 문제지만, 메모리나 저장 장치의 하드웨어 이상으로도 발생할 수 있습니다.
Core Dump는 꼭 활성화해야 하나요?
반복적으로 발생하는 오류를 분석해야 한다면 활성화하는 것이 좋습니다. 다만 운영 서버에서는 저장 공간을 고려해야 합니다.
GDB를 사용하지 않아도 해결할 수 있나요?
간단한 라이브러리 문제는 해결할 수 있지만, 프로그램 내부 버그를 분석하려면 GDB가 가장 효과적인 도구입니다.
마무리
Segmentation fault는 Linux 서버에서 가장 대표적인 메모리 관련 오류 중 하나입니다. 단순히 프로그램을 재시작하기보다는 dmesg, journalctl, Core Dump, GDB, ldd 등을 활용하여 정확한 원인을 분석하는 것이 중요합니다. 특히 동일한 오류가 반복된다면 코드 수정이나 라이브러리 점검이 반드시 필요합니다.