코어 덤프 파일 위치 (및 이름)를 설정하는 방법은 무엇입니까?


17

CentOS 6을 사용 중이며 개발중인 응용 프로그램에 코어 덤프를 사용하려고합니다. 나는 넣었다 :

ulimit -H -c unlimited >/dev/null
ulimit -S -c unlimited >/dev/null

내 bash 프로필에 있지만 코어 덤프는 여전히 새 터미널에서 생성되지 않았습니다.

또한 모든 사용자에 대해 소프트 제한이 0이되도록 /etc/security/limits.conf를 변경했습니다.

출력 할 코어 파일의 위치를 ​​어떻게 설정합니까? 파일 이름의 일부로 위치를 지정하고 덤프가 생성 된 시간을 추가하고 싶습니까?


1
도움이 될 것입니다 : stackoverflow.com/a/16048288/2808351
dhag

답변:


27

CentOS 6에서 코어 덤프의 위치를 ​​설정하려면 편집 할 수 있습니다 /etc/sysctl.conf. 예를 들어 코어 덤프를 원하는 경우 /var/crash:

kernel.core_pattern = /var/crash/core-%e-%s-%u-%g-%p-%t

변수는 다음과 같습니다.

% e 는 파일 이름입니다.
% g 는 프로세스가
% p 에서 실행되고있는 gid 입니다.
% s 는 프로세스의 pid입니다. % s 는 덤프를 일으킨 신호입니다.
% t 는 덤프가 발생한 시간입니다.
% u 는 프로세스가 실행중인 uid입니다.

또한 추가해야합니다 /etc/sysconfig/init

DAEMON_COREFILE_LIMIT='unlimited'

이제 새로운 변경 사항을 적용하십시오.

$ sysctl -p

그러나 이런 식으로 경고 오순절이 있습니다. 커널 매개 변수 인 kernel.core_pattern을 다음과 같이 수동으로 지정하더라도 다음 구성으로 재부팅 할 때 항상 재설정되고 덮어 쓰기되는 경우 /etc/sysctl.conf:

|/usr/libexec/abrt-hook-ccpp %s %c %p %u %g %t e

요약하자면 설치된 시스템이 abrtd.service시작을 kernel.core_pattern자동으로 덮어 씁니다 abrt-addon-ccpp. 이 문제를 해결하는 두 가지 방법이 있습니다.

  1. 구성 파일의 설정 DumpLocation옵션 /etc/abrt/abrt.conf. 구성 파일 /var/crash에서 DumpLocation =을 설정하여 대상 디렉토리를 지정할 수 있으며 표시되는 값은 동일하지만 실제로는 코어 파일이 아래 디렉토리에 작성됩니다 . /etc/abrt/abrt.confsysctl kernel.core_pattern/var/crash

    또한 SELinux를 활성화 한 경우 다음을 실행해야합니다.

    $ semanage fcontext -a -t public_content_rw_t "/var/crash(/.*)?"  
    $ setsebool -P abrt_anon_write 1
    

    그리고 마지막으로 다시 시작하십시오 abrtd.service.

    $ service abrtd.service restart
    
  2. abrtd 서비스를 중지하십시오. kernel.core_pattern덮어 쓰지 않습니다. -(시험 한 적이 없습니다).


1
멋진 답변입니다. EFI 시스템에서는 시스템 플래시에 덤프가 있다는 점도 주목할 가치가 있습니다.
mikeserv

0

Busybox에서 코어 덤프를 생성하기 위해 실행 파일을 실행하는 초기화 스크립트에서 아래 매개 변수를 추가 할 수 있습니다. 따라서 소프트웨어를 초기화하고 환경 변수를 내보낼 때마다 아래 줄을 스크립트에 복사하고 충돌이 발생할 경우 코어를 덤프 할 수 있습니다.

Busybox에서 코어 덤프의 위치를 ​​설정하려면 proc 파일 시스템을 사용하여 코어 파일 경로를 설정할 수 있습니다. 예를 들어, 코어 덤프를 원하는 경우 /tmp/crash/corefiles:

mkdir -p /tmp/crash/corefiles
chmod 775 /tmp/crash/corefiles
echo "/tmp/crash/corefiles/%e.%s.core" > /proc/sys/kernel/core_pattern

변수는 다음과 같습니다.

% e 는 파일 이름입니다.
% g 는 프로세스가
% p 에서 실행되고있는 gid 입니다.
% s 는 프로세스의 pid입니다. % s 는 덤프를 일으킨 신호입니다.
% t 는 덤프가 발생한 시간입니다.
% u 는 프로세스가 실행중인 uid입니다.

또한 코어 파일 크기를 설정해야합니다. 아래 명령은 코어 파일 크기를 무제한으로 설정합니다.

ulimit -c unlimited

이제 프로세스 내의 각 스레드에 설정된 코어 파일 크기를 확인하려면 다음을 사용하여 확인할 수 있습니다.

cat /proc/<PID>/limits

위 명령의 출력 :

Limit                     Soft Limit           Hard Limit           Units     
Max cpu time              unlimited            unlimited            seconds   
Max file size             unlimited            unlimited            bytes     
Max data size             unlimited            unlimited            bytes     
Max stack size            8388608              unlimited            bytes     
Max core file size        unlimited            unlimited            bytes     
Max open files            10000                10000                files     
Max address space         unlimited            unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             31868                31868                processes 
Max locked memory         65536                65536                bytes     
Max file locks            unlimited            unlimited            locks     
Max pending signals       31868                31868                signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us      

위 출력에서 ​​볼 수 있듯이 최대 코어 파일 크기는 무제한으로 설정되어 있습니다.

자세한 내용은이 링크를 방문하십시오. 리눅스 응용 프로그램 디버깅 기법 / 코어 파일

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.