코어 덤프 파일 위치(및 이름)를 어떻게 설정합니까?

코어 덤프 파일 위치(및 이름)를 어떻게 설정합니까?

저는 CentOS 6을 사용하고 있으며 개발 중인 애플리케이션에 대한 코어 덤프를 활성화하려고 합니다. 나는 다음을 넣었다:

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

내 bash 프로필에 추가했지만 여전히 코어 덤프가 생성되지 않습니다(새 터미널에서).

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

코어 파일의 출력 위치를 설정하는 방법은 무엇입니까? 위치를 지정하고 파일 이름의 일부로 덤프가 생성된 시간을 추가하고 싶습니까?

답변1

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

kernel.core_pattern=/var/crash/core-%e-%s-%u-%g-%p-%t #corrected spaces before and after =

여기서 변수는 다음과 같습니다.

%이자형파일 이름입니다
%G프로세스가 실행 중일 때의 gid입니다.
%피프로세스의 pid입니다
%에스덤프를 유발하는 신호입니다.
%티덤프가 발생하는 시간입니다.
%유실행 중인 프로세스의 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. 구성 파일에서 DumpLocation=을 설정하여 /var/crash대상 디렉터리를 지정할 수 있습니다 /etc/abrt/abrt.conf. 및 표시 값은 sysctl 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
  1. abrtd 서비스를 중지합니다. kernel.core_pattern덮어쓰지 않습니다. -(테스트해본 적은 없습니다).

답변2

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

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

여기서 변수는 다음과 같습니다.

%이자형파일 이름입니다
%G프로세스가 실행 중일 때의 gid입니다.
%피프로세스의 pid입니다
%에스덤프를 유발하는 신호입니다.
%티덤프가 발생하는 시간입니다.
%유실행 중인 프로세스의 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      

위 출력에서 ​​최대 코어 파일 크기가 무제한으로 설정되어 있음을 알 수 있습니다.

자세한 내용을 보려면 이 링크를 방문하세요. Linux 애플리케이션 디버깅 기술/핵심 문서

관련 정보