저는 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
. 이 문제를 해결하는 방법에는 두 가지가 있습니다.
- 구성 파일에서
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
- 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 애플리케이션 디버깅 기술/핵심 문서