커널 덤프-coredump 소개

8686 단어 Linux 기초 학습
배경.
liunx에서 c 언어 개발 프로그램은 최근에 프로그램 붕괴 현상을 만났는데 현장에서 어떠한 붕괴 정보도 볼 수 없기 때문에 문제를 포지셔닝하기 어렵다.이때, 내부 핵 저장 (coredump) 이 쓸모가 있게 되었다.
일반적인 상황에서coredmp는 프로그램이 실행될 때의 메모리, 레지스터 상태, 창고 지침, 메모리 관리 정보 등을 포함하고 설정이 적절하면 이coredump 파일은 프로그램이 잘못되었을 때 자동으로 생성됩니다.
coredump 파일 소개
Coredump 파일은 Unix/Linux 운영체제의 메커니즘으로 온라인 서비스에 있어 Core가 발생하는 과정은 서비스가 일시적으로 정상적으로 응답하지 못하고 복구해야 한다는 것을 의미한다. 또한 Core 프로세스의 메모리 공간이 클수록 이 과정은 오랫동안 지속될 수 있다(예를 들어 프로세스가 60G+ 이상의 메모리를 차지할 때 완전한 Core 파일은 15분이 걸려야 디스크에 완전히 쓸 수 있다). 이 기간에 발생하는 데이터 손실은헤아릴 수 없다.
한편, OS는 코어를 내보내는 동시에 현재 프로세스를 종료하지만 첫 번째 현장 데이터를 남긴다. OS는 셔터가 눌린 카메라와 같고 사진은 바로 코어 파일이다.프로세스가 종료될 때 메모리, CPU 레지스터 등 정보가 포함되어 있어 후속 개발자가 디버깅할 수 있다.
간단하게 말하면, 프로그램이 붕괴될 때, 시스템은 지정한 디렉터리에 코어 파일을 생성한다.core 파일은 주로 디버깅에 사용됩니다.
코어 파일 생성 열기 또는 닫기
다음 명령은 시스템이 코어 파일을 생성하지 못하게 합니다
ulimit -c 0

core 파일을 생성하는 옵션이 열려 있는지 확인합니다.
[john@localhost ~]$ ulimit -c
0
[john@localhost ~]$ 

-c는 커널 덤프 파일의 크기 제한을 나타내며 0으로 표시되면 열리지 않습니다.
core 덤프 파일 열기
ulimit -c 1073741824 #  1G
ulimit -c unlimited #     

설정을 영구적으로 적용하는 방법
위에서 말한 방법은 현재 셸에서만 적용되며, 다시 시작하면 잃어버립니다.영구적으로 적용되는 방법은 profile에 다음을 추가하는 것입니다.
#vi /etc/profile
ulimit -c 1073741824 #  ,                 ,        

또는
ulimit -c unlimited

이렇게 기계를 재부팅하면 효력이 발생한다.소스 명령을 사용하여 즉시 적용할 수도 있습니다.
source /etc/profile

커널에 저장된 파일 이름과 디렉토리를 지정합니다.
부족한 경우, 커널이coredump에 있을 때 발생하는 코어 파일은 이 프로그램과 같은 디렉터리에 있고, 파일 이름은core로 고정됩니다.
이 때, 여러 프로그램이 코어 파일을 생성하거나, 같은 프로그램이 여러 번 붕괴되면, 같은 코어 파일을 반복해서 덮어씁니다.
kernel의 매개 변수를 수정하여 커널 저장소에서 생성한core 파일의 경로와 파일 이름을 지정할 수 있습니다./etc/sysctl.conf에서sysctl 변수kernel을 설정합니다.core_pattern의 값입니다.
#vi /etc/sysctl.conf
kernel.core_pattern = /var/core/core_%e_%p #    coredump         
kernel.core_uses_pid = 0

설명이 필요한 것은/proc/sys/kernel/coreuses_pid의 내용이 1로 설정되어 있습니다. 설령 코어pattern에%p가 설정되어 있지 않으며 마지막으로 생성된 코어 dump 파일 이름에는 프로세스 ID가 추가됩니다.
여기서%e,%p는 각각 다음을 나타냅니다.
%c          
%e  dump    
%g  dump       ID
%h    
%p  dump   PID
%s     coredump   
%t     ( 1970 1 1      )
%u  dump       ID

다음 명령을 사용하여 수정 결과를 즉시 적용할 수 있습니다.
sysctl –p /etc/sysctl.conf

어떤 프로세스에coredump를 생성하도록 강제합니다
일부 버그는 프로그램crash를 일으키지 않습니다. 예를 들어 자물쇠가 사라지면 프로그램은 이미 정상적이지 않지만,coredump가 생기지 않습니다.만약 환경이 gdb 디버깅을 허용하지 않는다면, 이 프로세스에coredump 파일을 생성하도록 강요할 수 있습니다.
일반적인 상황에서watchdog을 이용하여 프로세스를 감시할 수 있다. 이 프로세스가 오랫동안 하트비트를 업데이트하지 않은 것을 발견하면 이 프로세스에coredump의 신호를 보낼 수 있다.linux의 신호 기본 처리 행위에 따라 SIGQUIT,SIGABRT,SIGFPE와SIGSEGV는 이 프로세스에coredump 파일을 생성할 수 있습니다.이렇게 하면 우리는coredump를 통해 자물쇠가 죽었는지 아닌지를 알 수 있다.물론 프로세스가 이 신호의 처리 함수를 추가하면coredump가 생기지 않습니다.
프로세스가 잠겨 있지 않거나 Block이 어디에 있는 경우도 있지만, 변수나 다른 정보를 얻기 위해 지정한 위치에서 디버깅을 해야 합니다.그러나 고객 환경이나 생산 환경일 수도 있기 때문에 우리가 장시간의 검사를 허용하지 않는다.그러면, 프로세스가 이 지점까지 실행될 때 스냅샷을 가져오려면coredump를 통과해야 합니다.이때 gdb를 이용하여 수동으로coredump를 생성할 수 있다.attach에서 이 프로세스를 진행할 때, 지정한 위치에서 인터럽트를 치고, 인터럽트가 터치될 때 gdb 명령 gcore를 사용하면 바로coredump를 생성할 수 있습니다.
core dump를 사용하여 디버깅
gdb 디버그 사용하기
  • 입력 명령: gdb 실행 파일coredump 파일, gdb 디버깅 프로그램 시작
  • 명령을 입력하십시오: gdb [-c] coredump 파일을 입력하고 gdb 알림부호에 입력하십시오: file 실행 프로그램
  • 이 때 백트랙/thread 등 명령으로 당시의 오류를 볼 수 있습니다. 프로그램이 로컬에서 붕괴점까지 실행되었거나,where로 리턴을 하거나, 프로그램이 어느 줄에서 떨어졌는지 표시할 수 있습니다.
    하나의 예
    #include 
    int main(void)
    {
        int *a = NULL;
        *a = 0x1;
    
        return 0;
    }
    gcc -g a.c 컴파일을 사용하여 실행 가능한 파일 a.out을 생성하고 실행하면:Segmentationfault(core dump)를 표시합니다. 이것은 현재 디렉터리에 a.out에 대응하는 내장 저장 파일이 생성되었음을 나타냅니다.다음과 같은 방법으로 GDB 디버깅을 시작합니다.
    #gdb -c ./*.core ./a.out
    GNU gdb (GDB) 7.1-Ubuntu
    ...
    Core was generated by './a.out'.
    Program terminated with signal 11, Segmentation fault.
    #0 0x00000000004004dc in main() at a.c:6
    6 *a =0x1;

    a.c의 여섯 번째 줄에서 11번 신호를 받았다.GDB의list 명령을 사용하면 근처의 원본 코드를 볼 수 있습니다.
    관련 참조
    시스템 기본 매개변수 설정 보기 ulimit -a
    [john@localhost ~]$ ulimit -a
    core file size          (blocks, -c) 0 #        core  
    data seg size           (kbytes, -d) unlimited
    scheduling priority             (-e) 0
    file size               (blocks, -f) unlimited
    pending signals                 (-i) 7168
    max locked memory       (kbytes, -l) 64
    max memory size         (kbytes, -m) unlimited
    open files                      (-n) 1024
    pipe size            (512 bytes, -p) 8
    POSIX message queues     (bytes, -q) 819200
    real-time priority              (-r) 0
    stack size              (kbytes, -s) 8192
    cpu time               (seconds, -t) unlimited
    max user processes              (-u) 4096
    virtual memory          (kbytes, -v) unlimited
    file locks                      (-x) unlimited
    [john@localhost ~]$

    ulimit 소개
    ulimit [-SHacdflmnpstuv [limit]]
                          ,   shell        ,          。    -H   -S                  。
                              ;        ,         。                       -H                   -S
                    ,            。 limit          ,           ,       hard, soft,   unlim‐
                  ited                       ,           ,           。                          limit,
                                 ,                                -H                            。       
                     ,                。            :
                  -a             
                  -c     core       
                  -d              
                  -f     shell          
                  -l                
                  -m             
                  -n                  (             )
                  -p         ,  512         (         )
                  -s          
                  -t     cpu         ,   
                  -u                 
                  -v     shell              
    
                        limit,             (   -a      )。        ,     -f。           1024
                    ,      -t            ,    -p           512          ,    -n         -u           。  
                  0,             ,               。

    좋은 웹페이지 즐겨찾기