malloclab 개발 중 디버깅을 여전히 하지 못하는 자신을 보며, 돌아보는 시간을 갖고자 꼬꼬무 타임을 갖기로 결정했습니다.
라는 메시지를 받은 이유는 무엇이고,
무엇이 잘못되었는지 파악할 때 팁과 디버깅 방법을 정리해는 시간을 갖겠습니다.
먼저 이 오류를 구성하고 있는 단어들의 의미부터 알아보겠습니다.
프로그램이 허용되지 않은 메모리 영역에 접근을 시도하거나, 허용되지 않은 방법으로 메모리 영역에 접근을 시도할 경우 발생하는 특수한 오류 중 하나이다.
Q. segmentation은 뭘까요?
세그멘테이션은 운영체제에서 사용하는 메모리 관리 및 보호의 한 기법입니다.
현재는 메모리 관리 정책이 대부분 페이징으로 대체되었으나, 여전히 일부 논리 레벨에서 세그멘테이션을 사용하기 때문에 해당 오류가 발생하는 것이죠!
세그멘테이션은 프로세스를 세그먼트의 집합으로 생각하고, 코드 / 데이터 / 스택 세그먼트와 같이 물리적인 크기 단위가 아니라 논리적 내용의 단위로 잘라서 관리합니다.
그에 비해 페이징은 프로세스를 일정 크기인 페이지 단위로 잘라서 메모리에 적재하는 방법입니다.
세그멘테이션만 사용하면 크기가 고정되어 있지 않아 가변적이기 때문에 현재 운영체제에서는 세그멘테이션의 세그먼트 개념을 사용하되, 세그먼트를 페이징(고정 크기로 분할)하는 방법을 사용하고 있죠.
Q. 그래서 segmentation fault는 왜 발생할까요?
결론은 잘못된 메모리 참조 때문에 발생하는 오류입니다.
프로그램이 운영체제로부터 배정받지 않은 메모리 영역을 침범하는 것을 운영체제에서 막으면서 오류를 발생시키는거죠.
이제 Segmentation Fault 오류가 발생하면서 같이 나오는 Core dumped에 대해 알아보겠습니다!
core dumped는 다른 말로 memory dump, system dump로도 표현할 수 있습니다.
즉, 특정 시점에 작업 중이던 메모리 상태를 dump 기록한다는 것이죠.
주로 프로그램이 비정상적으로 종료됐을 때 만들어집니다.
이러한 core dump는 프로그램 오류 진단과 디버깅에 쓰이죠.
core는 어디에 dump될까요?
찾아본 결과 저는 core dumped 파일이 생성되고 있지 않았습니다.
ulimit core 설정 변경
#ulimit 설정 값 확인
ulimit -a
#ulimit core 임시 변경
ulimit -c unlimited
#ulimit core 영구 변경
# * - core unimite 추가
vi /etc/security/limits.conf
core dump 파일 생성 규칙 변경
#현재 생성 위치 확인
cat /proc/sys/kernel/core_pattern
#생성 위치 실행 파일 위치로 변경하는 법
#core."파일이름" 형태로 저장됨
echo "core.%e" > /proc/sys/kernel/core_pattern
#permision denied 오류 뜰 경우 root 계정으로 변경하여 시도
sudo su - root
gnu 소프트웨어 시스템을 위한 기본 디버거입니다.
Valgrind는 리눅스 기반의 오픈소스 DBI 도구입니다. 이는 클라이언트 프로그램 의 실행 코드를 실행 시간에 직접 가공하는 기회를 제공하여, 메모리 누수를 탐지하는 등 리눅스에서 디버깅을 지원합니다.
[참고]
https://reakwon.tistory.com/220
https://copycode.tistory.com/108