Linux에서 코어 덤프 파일의 역할 및 사용

I. 개요

1.1 코어 덤프 파일이란 무엇입니까?

코어 덤프 파일은 프로그램이 충돌하거나 비정상적으로 종료될 때 운영 체제가 프로그램의 메모리 정보, 레지스터 상태, 스택 정보 등을 디버깅 및 분석을 위해 파일에 저장하는 파일을 말합니다. 코어 덤프 파일에는 일반적으로 프로그램이 충돌할 때 모든 상태 정보가 포함되어 있어 프로그래머가 프로그램 충돌의 원인을 빠르게 찾고 복구하는 데 도움이 될 수 있습니다.
코어 덤프 파일에는 주로 사용자 공간 스택, 코드 세그먼트, 데이터 세그먼트 및 힙을 포함한 사용자 공간의 메모리 정보가 포함됩니다. 어떤 이유로 프로세스가 비정상적으로 종료되면(예: 불법 메모리 액세스, 불법 명령 등) 운영 체제는 프로세스의 메모리 정보를 코어 덤프 파일에 저장할 수 있습니다. 이 파일은 문제의 원인을 찾기 위한 후속 디버깅에 사용할 수 있습니다.

코어 덤프 파일은 일반적으로 커널 공간 스택 정보를 포함하지 않습니다. 보안 및 격리상의 이유로 운영 체제가 커널 공간 정보를 사용자 모드 프로그램에 노출하지 않기 때문입니다. 따라서 코어 덤프 파일은 주로 커널 문제가 아닌 사용자 공간의 프로그램 문제를 분석하는 데 사용됩니다.

1.2 코어 덤프 파일의 기능 및 의미

코어 덤프 파일의 역할은 매우 중요하며, 프로그래머가 프로그램 충돌 시 상태 정보를 분석하고 프로그램 충돌 원인을 찾아 복구하는 데 도움을 줄 수 있습니다. 프로그래머는 코어 덤프 파일을 분석하여 프로그램 충돌 시 메모리 정보, 레지스터 상태, 스택 정보 등은 물론 프로그램 실행 시 기타 상태 정보를 파악할 수 있습니다. 이 정보는 프로그래머가 프로그램 충돌의 원인을 신속하게 찾고 프로그램 안정성과 신뢰성을 향상시키는 데 도움이 될 수 있습니다.

1.3 Linux에서 코어 덤프 파일의 저장 경로 및 명명 규칙

Linux에서는 코어 덤프 파일의 저장 경로 및 이름 지정 규칙을 구성할 수 있습니다. 기본적으로 코어 덤프 파일은 현재 작업 디렉터리에 저장되며 파일 이름은 core로 시작하고 뒤에 프로세스 번호가 옵니다. 예를 들어 프로세스 ID가 123인 프로세스의 코어 덤프 파일 이름은 core.123입니다.

시스템 구성 파일을 수정하여 코어 덤프 파일의 저장 경로 및 이름 지정 규칙을 지정할 수 있습니다. Linux에서 코어 덤프 파일의 저장 경로 및 이름 지정 규칙은 일반적으로 다음 두 파일에 의해 결정됩니다.

/proc/sys/kernel/core_pattern: 이 파일은 코어 덤프 파일의 이름 지정 규칙 및 저장 경로를 지정합니다. 예를 들어 코어 덤프 파일을 /var/crash 디렉토리에 저장하고 프로세스 이름과 프로세스 번호를 파일 이름으로 사용할 수 있습니다. 명령 규칙은 /var/crash/%!e(MISSING).%입니다. !p(MISSING).코어.
/etc/security/limits.conf: 이 파일은 코어 덤프 파일 생성을 위한 크기 제한을 지정합니다. 너무 많은 디스크 공간을 차지하지 않도록 이 파일을 수정하여 코어 덤프 파일의 크기를 제한할 수 있습니다.


2. 코어 덤프 파일 생성 활성화 방법

Linux에서는 기본적으로 코어 덤프 파일이 생성되지 않으며 수동으로 열어야 합니다. 다음은 코어 덤프 파일 생성을 활성화하는 세 가지 방법입니다.

2.1 ulimit 명령

ulimit 명령을 사용하여 파일 크기, 메모리 사용량 등과 같은 프로세스의 리소스 사용량을 제한할 수 있습니다. ulimit 명령의 매개변수를 설정하여 코어 덤프 파일 생성을 활성화할 수 있습니다. 구체적인 단계는 다음과 같습니다.

ulimit -c 무제한 명령을 실행하여 코어 덤프 파일의 크기 제한을 무제한으로 설정하십시오.
프로그램을 실행하면 프로그램이 충돌하거나 비정상적으로 종료될 때 코어 덤프 파일이 자동으로 생성됩니다.

2.2 sysctl 명령

sysctl 명령을 사용하여 커널 매개변수를 수정할 수 있습니다. sysctl 명령의 매개변수를 설정하여 코어 덤프 파일 생성을 활성화할 수 있습니다. 구체적인 단계는 다음과 같습니다.

sysctl -w kernel.core_pattern=/tmp/core-%!e(MISSING)-%!s(MISSING)-%!u(MISSING)-%!g(MISSING)-%!p(MISSING)-%!를 실행합니다. t(MISSING) 명령에서 코어 덤프 파일의 이름 지정 규칙을 /tmp/core-%!e(MISSING)-%!s(MISSING)-%!u(MISSING)-%!g(MISSING)-%로 설정합니다. !p(누락)-%!t(누락).
ulimit -c 무제한 명령을 실행하여 코어 덤프 파일의 크기 제한을 무제한으로 설정하십시오.
프로그램을 실행하면 프로그램이 충돌하거나 비정상적으로 종료될 때 코어 덤프 파일이 자동으로 생성됩니다.

2.3 /proc/sys/kernel/core_pattern 파일

/proc/sys/kernel/core_pattern 파일을 수정하여 코어 덤프 파일 생성을 활성화할 수 있습니다. 구체적인 단계는 다음과 같습니다.

echo "/tmp/core-%!e(MISSING)-%!s(MISSING)-%!u(MISSING)-%!g(MISSING)-%!p(MISSING)-%!t(MISSING)" 실행 > /proc/sys/kernel/core_pattern 명령, 코어 덤프 파일의 명명 규칙을 /tmp/core-%!e(MISSING)-%!s(MISSING)-%!u(MISSING)-%!g로 설정 (누락)-%!p(누락)-%!t(누락).
ulimit -c 무제한 명령을 실행하여 코어 덤프 파일의 크기 제한을 무제한으로 설정하십시오.
프로그램을 실행하면 프로그램이 충돌하거나 비정상적으로 종료될 때 코어 덤프 파일이 자동으로 생성됩니다.
위의 방법을 통해 코어 덤프 파일 생성을 활성화하여 프로그램의 충돌 또는 비정상적인 상황을 디버깅하고 분석할 수 있습니다.


3. 코어 덤프 파일 분석 방법

프로그램에서 예외 또는 충돌이 발생하면 운영 체제에서 코어 덤프 파일을 생성합니다. 이 파일에는 프로그램 충돌 시 메모리 상태가 포함되어 있어 개발자가 문제를 빠르게 찾는 데 도움이 될 수 있습니다. 다음은 코어 덤프 파일을 분석하기 위해 일반적으로 사용되는 몇 가지 도구를 소개합니다.

3.1 gdb 디버깅 도구

gdb는 C 및 C++ 프로그램을 디버깅하는 데 사용할 수 있는 강력한 디버깅 도구입니다. 코어 덤프 파일을 읽고 프로그램 충돌 시 메모리 상태를 분석하는 일련의 명령을 제공할 수 있습니다.

gdb로 코어 덤프 파일을 분석하는 단계는 다음과 같습니다.

코어 덤프 파일 열기:
gdb
프로그램 충돌 시 스택 정보 보기:
(gdb) bt
프로그램 충돌 시 변수 값 보기:
(gdb) p
프로그램 충돌 시 레지스터 상태 보기:
( gdb) info는
프로그램이 충돌할 때 어셈블리 코드를 보기 위해 등록합니다.
(gdb) disassemble

3.2 objdump 도구

objdump는 실행 파일과 공유 라이브러리 파일을 어셈블리 코드로 분해할 수 있는 분해 도구입니다. 프로그램이 충돌할 때 어셈블리 코드를 분석하고 문제를 찾는 데 사용할 수 있습니다.

objdump를 사용하여 코어 덤프 파일을 분석하는 단계는 다음과 같습니다.

코어 덤프 파일에서 프로그램 코드 세그먼트 보기:
objdump -d -j .text
코어 덤프 파일에서 프로그램 데이터 세그먼트 보기:
objdump -s -j .data
코어 덤프 파일에서 프로그램 기호 테이블 보기:
objdump -t

3.3 readelf 도구

readelf는 실행 파일 및 공유 라이브러리 파일의 ELF 형식 헤더를 보기 위한 도구입니다. 프로그램이 충돌할 때 메모리 레이아웃을 분석하고 문제를 찾는 데 사용할 수 있습니다.

readelf로 코어 덤프 파일을 분석하는 단계는 다음과 같습니다.

코어 덤프 파일에서 프로그램 세그먼트 보기:

readelf -S <executable>

코어 덤프 파일에서 프로그램 기호 테이블 보기:

readelf -s <executable>

코어 덤프 파일에서 프로그램 동적 링크 정보를 봅니다.

readelf -d <executable>

3.4 coredumpctl 명령

coredumpctl은 시스템에서 코어 덤프 파일을 관리하기 위한 명령줄 도구입니다. 시스템의 최신 코어 덤프 파일을 보고 분석하는 데 사용할 수 있습니다.

coredumpctl 명령을 사용하여 코어 덤프 파일을 분석하는 단계는 다음과 같습니다.

시스템에서 가장 최근의 코어 덤프 파일 보기:

coredumpctl list

지정된 코어 덤프 파일 보기:

coredumpctl info <coredump>

지정된 코어 덤프 파일을 분석합니다.

coredumpctl gdb <coredump>

4. 코어 덤프 파일의 크기를 제한하는 방법

대부분의 경우 결과 코어 덤프 파일이 매우 커서 디스크 공간을 많이 차지할 수 있습니다. 이를 방지하기 위해 코어 덤프 파일의 크기를 제한할 수 있습니다. 다음은 몇 가지 방법입니다.

4.1 ulimit 명령

ulimit 명령을 사용하여 사용자의 코어 덤프 파일 크기를 제한할 수 있습니다. 다음은 예입니다.

$ ulimit -c 1000000

이 명령은 사용자 생성 코어 덤프 파일의 크기를 1MB로 제한합니다. 더 큰 파일을 생성하려고 하면 프로그램이 오류와 함께 종료됩니다.

4.2 /etc/security/limits.conf 파일

/etc/security/limits.conf 파일에서 코어 덤프 파일 크기 제한을 설정할 수도 있습니다. 다음은 예입니다.

*               soft    core            1000000

이 줄은 모든 사용자 생성 코어 덤프 파일의 크기를 1MB로 제한합니다. 필요에 따라 이 값을 조정할 수 있습니다.

이 변경 사항을 적용하려면 시스템을 재부팅하거나 로그아웃했다가 다시 로그인해야 합니다.

4.3 core_pattern 파일

Linux 시스템에서 생성된 코어 덤프 파일의 이름과 위치는 core_pattern 파일에 의해 정의됩니다. 생성할 때 코어 덤프 파일의 크기를 제한하려면 다음과 같이 core_pattern 파일에 %!h(MISSING)/%!e(MISSING).%!p(MISSING).core.%!t(MISSING)and를 추가할 수 있습니다.|/bin/dd of=/path/to/core/files/core.%!e(MISSING).%!p(MISSING).%!t(MISSING) bs=1M count=10

echo "%!h(MISSING)/%!e(MISSING).%!p(MISSING).core.%!t(MISSING)" > /proc/sys/kernel/core_pattern
echo "|/bin/dd of=/path/to/core/files/core.%!e(MISSING).%!p(MISSING).%!t(MISSING) bs=1M count=10" >> /proc/sys/kernel/core_pattern

이렇게 하면 코어 덤프 파일이 /path/to/core/files/ 디렉토리에 기록되고 크기가 10MB로 제한됩니다. 필요에 따라 이 값을 조정할 수 있습니다.

core_pattern 파일을 수정하면 실행 중인 모든 프로그램에 영향을 줄 수 있습니다. 이 파일을 수정하는 방법을 잘 모르는 경우 먼저 원본 파일을 백업하십시오.


5. 쓸모없는 코어 덤프 파일을 정리하는 방법

5.1 수동 삭제

쓸모없는 코어 덤프 파일을 수동으로 삭제하는 것이 가장 쉬운 방법입니다. 다음 명령을 사용하여 제거할 수 있습니다.

$ rm /path/to/core/files/*.core

이렇게 하면 /path/to/core/files/ 디렉토리의 모든 .core 파일이 삭제됩니다. 특정 날짜보다 오래된 파일만 삭제하려면 find 명령을 사용할 수 있습니다.

$ find /path/to/core/files/ -type f -name "*.core" -mtime +7 -delete

이 명령은 /path/to/core/files/ 디렉토리에서 7일보다 오래된 모든 .core 파일을 삭제합니다.

5.2 자동 정리 스크립트

코어 덤프 파일을 수동으로 정리하지 않으려면 자동 정리 스크립트를 작성할 수 있습니다. 다음은 예제 스크립트입니다.

#!/bin/bash

CORE_DIR=/path/to/core/files/
DAYS_TO_KEEP=7

find $CORE_DIR -type f -name "*.core" -mtime +$DAYS_TO_KEEP -delete

위 스크립트를 clean_core_files.sh로 저장하고 실행 권한을 추가합니다.

$ chmod +x clean_core_files.sh

이 스크립트를 cron에 추가하여 주기적으로 실행할 수 있습니다.

$ crontab -e

그런 다음 다음 줄을 추가합니다.

0 0 * * * /path/to/clean_core_files.sh

이렇게 하면 매일 자정에 코어 덤프 파일이 지워집니다.

5.3 coredumpctl 명령

Systemd를 사용하는 경우 coredumpctl 명령을 사용하여 코어 덤프 파일을 관리할 수 있습니다.

다음은 일반적으로 사용되는 몇 가지 coredumpctl 명령입니다.

모든 코어 덤프 파일 나열:

$ coredumpctl list

모든 코어 덤프 파일 지우기:

$ coredumpctl purge

특정 코어 덤프 파일의 세부 정보 보기:

$ coredumpctl info /path/to/core/file

코어 덤프 파일에서 스택 추적을 추출합니다.

$ coredumpctl gdb /path/to/core/file

coredumpctl 명령은 Systemd 지원이 필요하며 Systemd를 실행하는 시스템에서만 사용할 수 있습니다.


6. 예시 분석

코어 덤프 파일을 분석하기 전에 GDB 도구를 설치해야 합니다. Ubuntu에 GDB를 설치하는 명령은 다음과 같습니다.

$ sudo apt-get install gdb

6.1 코어 덤프 파일의 스택 정보 분석

코어 덤프 파일의 스택 정보를 분석하려면 다음 명령을 사용하십시오.

$ gdb /path/to/executable /path/to/core/file

그러면 GDB 명령줄 인터페이스가 열리고 코어 덤프 파일이 로드됩니다. bt 명령을 사용하여 스택 추적 정보를 볼 수 있습니다.

(gdb) bt

이 명령은 프로그램이 충돌한 이유를 확인하는 데 도움이 되는 함수 호출 스택 추적을 표시합니다.

6.2 코어 덤프 파일의 레지스터 정보 분석

코어 덤프 파일의 레지스터 정보를 분석하려면 다음 명령을 사용하십시오.

$ gdb /path/to/executable /path/to/core/file

그런 다음 info registers 명령을 사용하여 모든 레지스터의 값을 봅니다.

(gdb) info registers

이 명령은 프로그램 충돌 시 프로그램 상태를 이해하는 데 도움이 되도록 모든 레지스터의 값을 표시합니다.

6.3 코어 덤프 파일의 메모리 정보 분석

코어 덤프 파일의 메모리 정보를 분석하려면 다음 명령을 사용하십시오.

$ gdb /path/to/executable /path/to/core/file

그런 다음 x 명령을 사용하여 메모리 내용을 봅니다.

(gdb) x/nfu address

여기서 n은 표시할 메모리 셀 수, f는 표시 형식, u는 셀 크기, address는 표시할 메모리 주소입니다. 예를 들어 다음 명령은 주소 0x0에서 시작하는 처음 16바이트를 표시합니다.

(gdb) x/16xb 0x0

이 명령은 프로그램 충돌 시 메모리 상태를 이해하는 데 도움이 되도록 16진수 형식으로 16바이트를 표시합니다.


7. 일반적인 문제 및 해결 방법

디버깅 및 분석을 위해 코어 덤프 파일을 사용할 때 발생할 수 있는 몇 가지 일반적인 문제가 있습니다. 다음은 몇 가지 일반적인 문제와 해결 방법입니다.

7.1 코어 덤프 파일을 생성할 수 없습니다.

코어 덤프 파일을 생성할 수 없는 경우 다음 조건이 충족되는지 확인하십시오.

운영 체제는 코어 덤프 파일 생성을 허용합니다.
프로그램은 코어 덤프 파일 생성에 대한 제한을 설정했습니다(예: ulimit 명령 사용).
프로그램은 런타임에 코어 덤프 파일을 생성하기 위해 신호를 마스킹하지 않습니다.
여전히 코어 덤프 파일을 생성할 수 없으면 strace 명령을 사용하여 프로그램을 추적하고 오류 메시지가 있는지 확인하십시오.

7.2 코어 덤프 파일이 너무 커서 디스크 공간이 부족합니다.

프로그램에서 생성한 코어 덤프 파일이 너무 크면 디스크 공간이 부족할 수 있습니다. 이 경우 다음 해결 방법을 시도해 볼 수 있습니다.

생성된 코어 덤프 파일의 크기를 제한합니다(예: ulimit 명령 사용).
코어 덤프 파일을 다른 디스크나 저장 장치에 씁니다.
쓸모없는 코어 덤프 파일을 정기적으로 정리하십시오.

7.3 코어 덤프 파일의 정보가 불완전하거나 정확하지 않습니다.

생성된 코어 덤프 파일의 정보가 불완전하거나 정확하지 않은 경우 다음과 같은 이유가 있을 수 있습니다.

프로그램이 코어 덤프 파일을 생성하는 동안 메모리 또는 상태를 수정했습니다.
생성된 코어 덤프 파일은 일부 정보만 포함할 수 있습니다(예: 현재 스레드의 정보만).
사용된 디버깅 도구는 코어 덤프 파일의 정보를 올바르게 구문 분석하지 못할 수 있습니다.
이 경우 다른 디버깅 도구를 사용하거나 디버깅 및 프로파일링을 위해 다른 방법을 사용할 수 있습니다.


8. 요약

이 기사에서는 코어 덤프 파일이 무엇이고 무엇을 하는지 소개하고 이를 생성, 캡처 및 분석하는 방법을 배웠습니다. GDB 도구를 사용하여 코어 덤프 파일의 스택, 레지스터 및 메모리 정보를 분석하여 프로그램 충돌 및 디버그 오류의 원인을 진단하는 방법을 배웠습니다.

또한 수동 제거, 자동 정리 스크립트 작성 및 coredumpctl 명령 사용을 포함하여 쓸모 없는 코어 덤프 파일을 정리하는 방법에 대해서도 논의했습니다.

마지막으로 개발 및 테스트 중에 코어 덤프 파일을 생성하고 분석하는 것의 중요성을 강조합니다. 코어 덤프 파일은 프로그램 충돌에 대한 유용한 정보를 제공하여 코드 품질 및 시스템 안정성을 개선하는 데 도움이 됩니다.

Guess you like

Origin blog.csdn.net/qq_21438461/article/details/129790798