Linux Bus error 오류가 발생하는 원인과 해결 방법

Linux 서버에서 프로그램을 실행하다 보면 갑자기 종료되면서 Bus error라는 메시지가 출력되는 경우가 있습니다. Segmentation fault와 비슷하게 메모리 접근 과정에서 발생하는 오류이지만, 원인과 의미는 다릅니다.

Bus error는 CPU가 접근할 수 없는 메모리 주소를 사용하거나, 메모리 정렬(Alignment)이 올바르지 않거나, 손상된 메모리 매핑(Memory Mapping) 영역에 접근했을 때 발생하는 오류입니다. C/C++ 프로그램이나 데이터베이스, 메모리 매핑 파일(mmap)을 사용하는 프로그램에서 자주 발생합니다.

이번 글에서는 Bus error 오류가 발생하는 원인과 확인 방법, 해결 방법을 자세히 알아보겠습니다.

Bus error란 무엇인가?

Bus error는 운영체제가 프로그램에 SIGBUS(Signal 7) 신호를 전달하면서 발생하는 오류입니다.

대표적인 오류 예시는 다음과 같습니다.

Bus error (core dumped)

또는

Program terminated with signal SIGBUS, Bus error.

또는

Bus error

프로그램이 비정상적으로 종료되었다면 Core Dump가 생성되었는지도 함께 확인하는 것이 좋습니다.

Bus error가 발생하는 대표적인 원인

다음과 같은 경우에 자주 발생합니다.

  • 잘못된 메모리 정렬(Alignment)
  • 손상된 메모리 매핑 파일(mmap)
  • 저장 장치 I/O 오류
  • NFS 파일 시스템 오류
  • 파일 크기 변경 후 mmap 접근
  • 손상된 바이너리 파일
  • 메모리 하드웨어 오류
  • SSD/HDD 장애
  • 프로그래밍 오류
  • 파일 시스템 손상

실무에서는 Core Dump와 시스템 로그를 함께 확인하는 것이 가장 중요합니다.

1. Core Dump 생성 여부 확인하기

Core Dump 파일이 생성되었는지 확인합니다.

ls -lh core*

Core Dump가 생성되었다면 디버깅에 활용할 수 있습니다.

현재 Core Dump 설정을 확인하려면 다음 명령을 실행합니다.

ulimit -c

값이 0이라면 Core Dump 생성이 비활성화된 상태입니다.

활성화하려면 다음 명령을 실행합니다.

ulimit -c unlimited

2. 시스템 로그 확인하기

커널 로그를 확인합니다.

dmesg

또는

journalctl -xe

SIGBUS, Bus error, I/O error 관련 메시지가 있는지 확인합니다.

3. Core Dump 분석하기

Core Dump가 생성되었다면 GDB로 분석합니다.

gdb 프로그램명 core

백트레이스를 확인합니다.

bt

오류가 발생한 함수와 위치를 확인할 수 있습니다.

4. 메모리 사용량 확인하기

메모리 부족 여부를 확인합니다.

free -h

메모리 부족이 직접적인 원인은 아니지만 다른 문제와 함께 발생할 수 있습니다.

5. 디스크 상태 확인하기

디스크 사용량을 확인합니다.

df -h

디스크가 가득 차거나 읽기 오류가 발생하는지 확인합니다.

6. SMART 상태 확인하기

저장 장치 상태를 확인합니다.

smartctl -H /dev/sda

상세 정보 확인

smartctl -a /dev/sda

배드 섹터나 디스크 이상이 있는지 확인합니다.

7. 파일 시스템 검사하기

파일 시스템 오류를 확인합니다.

fsck /dev/sda1

운영 중인 파티션에서는 실행하지 말고 복구 모드에서 수행하는 것이 안전합니다.

8. 메모리 검사하기

물리 메모리 오류가 의심된다면 메모리 테스트를 수행합니다.

예를 들어 GRUB의 **MemTest86+**를 이용하거나 서버 제조사의 진단 도구를 사용할 수 있습니다.

ECC 메모리를 사용하는 서버에서는 하드웨어 로그도 함께 확인하는 것이 좋습니다.

9. mmap 사용 여부 확인하기

애플리케이션에서 메모리 매핑 파일을 사용하는 경우 파일이 삭제되거나 크기가 변경되지 않았는지 확인합니다.

개발 환경에서는 mmap() 호출 이후 파일 크기 변경 여부를 점검하는 것이 중요합니다.

10. 프로그램 재컴파일하기

손상된 실행 파일이나 라이브러리 문제일 수도 있습니다.

개발 환경에서는 다음과 같이 디버그 옵션을 추가하여 다시 빌드하는 것이 좋습니다.

gcc -g source.c -o program

디버그 심볼을 포함하면 GDB 분석이 훨씬 쉬워집니다.

Bus error 문제를 확인하는 순서

실무에서는 다음 순서대로 점검하는 것이 가장 효율적입니다.

  1. Core Dump 생성 여부 확인
  2. dmesg 확인
  3. journalctl 확인
  4. GDB 분석
  5. 메모리 확인
  6. 디스크 상태 확인
  7. SMART 확인
  8. 파일 시스템 검사
  9. mmap 사용 여부 확인
  10. 프로그램 재컴파일

이 순서대로 확인하면 대부분의 원인을 빠르게 찾을 수 있습니다.

Segmentation fault와의 차이점

오류의미
Segmentation fault접근 권한이 없는 메모리에 접근
Bus error접근 가능한 메모리라도 정렬 오류나 잘못된 물리 주소 접근으로 발생

둘 다 메모리 관련 오류이지만 발생 원인은 다르므로 분석 방법도 조금씩 다릅니다.

자주 묻는 질문

Bus error가 발생하면 메모리가 고장 난 것인가요?

반드시 그렇지는 않습니다. 프로그램 버그, 파일 시스템 문제, mmap 사용 오류도 흔한 원인입니다.

Core Dump가 생성되지 않습니다.

ulimit -c 값을 확인하고, 필요하면 ulimit -c unlimited로 설정한 후 다시 실행해 보세요.

GDB 분석이 꼭 필요한가요?

프로그램 개발이나 원인 분석이 필요한 경우에는 GDB와 Core Dump 분석이 가장 효과적인 방법입니다.

마무리

Bus error는 Linux에서 메모리 접근이나 저장 장치 문제와 관련하여 발생하는 대표적인 오류입니다. dmesg, journalctl, Core Dump, GDB, smartctl, fsck 등을 활용하면 대부분의 원인을 정확하게 분석할 수 있습니다. 특히 Segmentation fault와 구분하여 원인을 파악하면 문제 해결 시간을 크게 줄일 수 있습니다.

댓글 남기기