답변:
사용중인 쉘에 따라 다릅니다. bash를 사용하는 경우 ulimit 명령은 코어 실행 여부와 같은 프로그램 실행과 관련된 여러 설정을 제어합니다. 입력하면
ulimit -c unlimited
그러면 프로그램이 어떤 크기의 코어도 덤프 할 수 있다고 bash에 알릴 것입니다. 원하는 경우 무제한 대신 52M과 같은 크기를 지정할 수 있지만 실제로는 코어 파일의 크기가 결코 문제가되지 않으므로 필요하지 않습니다.
tcsh에서는 다음을 입력합니다
limit coredumpsize unlimited
위에서 설명한 것처럼 여기서 실제로 묻는 질문은 활성화되지 않은 시스템에서 코어 덤프를 활성화하는 방법입니다. 그 질문에 대한 답이 여기에 있습니다.
중단 된 프로세스에 대한 코어 덤프를 생성하는 방법을 배우려고 여기에 온다면 그 대답은
gcore <pid>
시스템에서 gcore를 사용할 수없는 경우
kill -ABRT <pid>
kill -SEGV를 사용하지 마십시오. 종종 신호 처리기를 호출하여 걸린 프로세스를 진단하기 어렵게 만듭니다.
-ABRT
보다 신호 처리기를 호출합니다 -SEGV
중지 판단이 segfault의 이상 복구 할 가능성이 더 높습니다로. segfault를 처리하는 경우 일반적으로 처리기가 종료 되 자마자 다시 트리거됩니다. 코어 덤프 생성을위한 더 나은 신호 선택은입니다 -QUIT
.
코어 덤프가 생성되는 위치를 확인하려면 다음을 실행하십시오.
sysctl kernel.core_pattern
또는:
cat /proc/sys/kernel/core_pattern
%e
프로세스 이름과 %t
시스템 시간 은 어디에 있습니까 ? 에서 변경 /etc/sysctl.conf
하고 다시로드 할 수 있습니다 sysctl -p
.
코어 파일이 생성되지 않은 경우 ( sleep 10 &
및로 테스트 killall -SIGSEGV sleep
) 다음으로 한계를 확인하십시오 ulimit -a
.
코어 파일 크기가 제한되어 있으면 다음을 실행하십시오.
ulimit -c unlimited
무제한으로 만들 수 있습니다.
그런 다음 코어 덤핑에 성공하면 다음과 같이 세그먼테이션 오류 표시 후 "(코어 덤프)"가 표시됩니다.
분할 오류 : 11 (코어 덤프)
참조 : 코어 덤프 -하지만 핵심 파일이 현재 디렉토리에 있지?
우분투에서 코어 덤프는 Apport에 의해 처리되며 에 위치 할 수 있습니다 /var/crash/
. 그러나 안정적인 릴리스에서는 기본적으로 비활성화되어 있습니다.
자세한 내용 은 Ubuntu에서 코어 덤프를 어디서 찾을 수 있습니까? 를 확인하십시오. .
macOS의 경우 : Mac OS X에서 코어 덤프를 생성하는 방법은 무엇입니까?
내가 마지막에 한 것은 충돌하기 전에 프로세스에 gdb를 첨부 한 다음 segfault를 얻었을 때 나는 generate-core-file
명령을 실행했다 . 이로 인해 코어 덤프가 생성되었습니다.
ge
)
ulimit -c
으로 unlimited
하지만, 코어 파일이 더 만들어 잠잠되면, generate-core-file
GDB 세션에서 파일 덕분에 코어 파일을 생성한다.
어쩌면 이런 식으로 할 수 있습니다.이 프로그램은 세그먼테이션 오류를 포착하고 디버거 (이것은 아래에서 사용되는 원래 코드 AIX
임)에 쉘을 트랩하는 방법을 보여주고 스택 추적을 세그먼테이션 오류 지점까지 인쇄합니다. Linux의 경우 sprintf
사용할 변수 를 변경해야합니다 gdb
.
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <stdarg.h>
static void signal_handler(int);
static void dumpstack(void);
static void cleanup(void);
void init_signals(void);
void panic(const char *, ...);
struct sigaction sigact;
char *progname;
int main(int argc, char **argv) {
char *s;
progname = *(argv);
atexit(cleanup);
init_signals();
printf("About to seg fault by assigning zero to *s\n");
*s = 0;
sigemptyset(&sigact.sa_mask);
return 0;
}
void init_signals(void) {
sigact.sa_handler = signal_handler;
sigemptyset(&sigact.sa_mask);
sigact.sa_flags = 0;
sigaction(SIGINT, &sigact, (struct sigaction *)NULL);
sigaddset(&sigact.sa_mask, SIGSEGV);
sigaction(SIGSEGV, &sigact, (struct sigaction *)NULL);
sigaddset(&sigact.sa_mask, SIGBUS);
sigaction(SIGBUS, &sigact, (struct sigaction *)NULL);
sigaddset(&sigact.sa_mask, SIGQUIT);
sigaction(SIGQUIT, &sigact, (struct sigaction *)NULL);
sigaddset(&sigact.sa_mask, SIGHUP);
sigaction(SIGHUP, &sigact, (struct sigaction *)NULL);
sigaddset(&sigact.sa_mask, SIGKILL);
sigaction(SIGKILL, &sigact, (struct sigaction *)NULL);
}
static void signal_handler(int sig) {
if (sig == SIGHUP) panic("FATAL: Program hanged up\n");
if (sig == SIGSEGV || sig == SIGBUS){
dumpstack();
panic("FATAL: %s Fault. Logged StackTrace\n", (sig == SIGSEGV) ? "Segmentation" : ((sig == SIGBUS) ? "Bus" : "Unknown"));
}
if (sig == SIGQUIT) panic("QUIT signal ended program\n");
if (sig == SIGKILL) panic("KILL signal ended program\n");
if (sig == SIGINT) ;
}
void panic(const char *fmt, ...) {
char buf[50];
va_list argptr;
va_start(argptr, fmt);
vsprintf(buf, fmt, argptr);
va_end(argptr);
fprintf(stderr, buf);
exit(-1);
}
static void dumpstack(void) {
/* Got this routine from http://www.whitefang.com/unix/faq_toc.html
** Section 6.5. Modified to redirect to file to prevent clutter
*/
/* This needs to be changed... */
char dbx[160];
sprintf(dbx, "echo 'where\ndetach' | dbx -a %d > %s.dump", getpid(), progname);
/* Change the dbx to gdb */
system(dbx);
return;
}
void cleanup(void) {
sigemptyset(&sigact.sa_mask);
/* Do any cleaning up chores here */
}
코어 덤프를 활성화하려면 다음을 수행하십시오.
에서 /etc/profile
코멘트 라인 :
# ulimit -S -c 0 > /dev/null 2>&1
에서 /etc/security/limits.conf
라인 밖으로 코멘트 :
* soft core 0
cmd를 실행하고 cmd limit coredumpsize unlimited
로 확인하십시오 limit
.
# limit coredumpsize unlimited
# limit
cputime unlimited
filesize unlimited
datasize unlimited
stacksize 10240 kbytes
coredumpsize unlimited
memoryuse unlimited
vmemoryuse unlimited
descriptors 1024
memorylocked 32 kbytes
maxproc 528383
#
kill -s SEGV <PID>
코어 파일이 작성되었는지 확인하려면 cmd를 사용하여 관련 프로세스를 종료 할 수 있습니다 (코어 파일이 작성되지 않은 경우이를 확인으로 사용할 수 있음).
# kill -s SEGV <PID>
코어 파일이 작성되면 관련 파일 (1./2./3.)에서 코어 덤프 설정을 다시 비활성화하십시오.
우분투 14.04
코어 덤프 활성화 확인 :
ulimit -a
라인 중 하나는 다음과 같아야합니다.
core file size (blocks, -c) unlimited
그렇지 않은 경우 :
gedit ~/.bashrc
ulimit -c unlimited
파일 끝에 추가 하고 저장하고 터미널을 다시 실행하십시오.
디버그 정보로 애플리케이션을 빌드하십시오.
Makefile에서 -O0 -g
코어 덤프를 작성하는 애플리케이션을 실행하십시오 (이름이 'core'인 코어 덤프 파일은 application_name 파일 근처에 작성되어야 함).
./application_name
gdb에서 실행하십시오.
gdb application_name core
ulimit -c unlimited
터미널 솔루션을 수정 ~/.bashrc
해야 변경 사항이 적용 되므로 임시 솔루션을 위해 터미널에 넣을 수도 있습니다 .
기본적으로 코어 파일이 제공됩니다. 프로세스의 현재 디렉토리가 쓰기 가능하거나 코어 파일이 작성되지 않았는지 확인하십시오.
system call을 사용하여 프로그래밍 방식으로 코어 덤프를 설정하는 것이 setrlimit
좋습니다.
예:
#include <sys/resource.h>
bool enable_core_dump(){
struct rlimit corelim;
corelim.rlim_cur = RLIM_INFINITY;
corelim.rlim_max = RLIM_INFINITY;
return (0 == setrlimit(RLIMIT_CORE, &corelim));
}
ulimit -c unlimited
은 명령 행 환경에서 필요하지 않은 다음 응용 프로그램을 다시 실행하십시오.
ulimit -c unlimited
. 또한 마르코 정의로 컴파일 할 수 있으며, enable_core_dump
릴리스시 매크로를 정의 하지 않으면 응용 프로그램에 기호가 포함 되지 않으며 디버그 버전으로 코어 덤프 대체가 제공됩니다.
당신이있는 경우에 있다는 언급이의 가치 systemd 세트를, 다음 일들이 조금 다릅니다. 설정은 일반적으로 core_pattern
sysctl 값을 통해 코어 파일이 파이프되도록 합니다 systemd-coredump(8)
. 코어 파일 크기 rlimit는 일반적으로 이미 "무제한"으로 구성되어 있습니다.
그런 다음을 사용하여 코어 덤프를 검색 할 수 있습니다 coredumpctl(1)
.
코어 덤프 등의 스토리지는로 구성됩니다 coredump.conf(5)
. coredumpctl 매뉴얼 페이지에서 코어 파일을 얻는 방법에 대한 예가 있지만 간단히 말하면 다음과 같습니다.
핵심 파일을 찾으십시오.
[vps@phoenix]~$ coredumpctl list test_me | tail -1
Sun 2019-01-20 11:17:33 CET 16163 1224 1224 11 present /home/vps/test_me
핵심 파일을 얻으십시오 :
[vps@phoenix]~$ coredumpctl -o test_me.core dump 16163
우분투 19.04
다른 모든 답변 자체는 저에게 도움이되지 않았습니다. 그러나 다음 요약은 일을했습니다.
~/.config/apport/settings
다음 내용으로 작성하십시오 .
[main]
unpackaged=true
(이것은 apport가 커스텀 앱을위한 핵심 덤프를 작성하도록 지시합니다)
확인 : ulimit -c
. 0을 출력하면
ulimit -c unlimited
경우에 대비하여 apport를 다시 시작하십시오.
sudo systemctl restart apport
충돌 파일이 작성되었습니다 /var/crash/
. 그러나 gdb와 함께 사용할 수 없습니다 . gdb와 함께 사용하려면
apport-unpack <location_of_report> <target_directory>
추가 정보 :
core_pattern
합니다. 다시 시작할 때 apport 서비스가 해당 파일을 덮어 쓸 수 있습니다.ulimit -c
당신이 웹의 다른 답변을 시도하는 동안 값이 자동으로 변경 얻을 수 있습니다. 코어 덤프 작성을 설정하는 동안 정기적으로 확인하십시오.참고 문헌 :