문제

나는 과정에서 리눅스의을 받고 segmentation fault.어떻게 알 수 있습니 그것을 생성하는 핵심 덤프하지 못할 경우?

도움이 되었습니까?

해결책

이에 따라 달라집 셸을 사용하고 있습니다.를 사용하는 경우 bash,다음 ulimit 명령 컨트롤러 설정에 관련된 프로그램 실행,같은 해야 하는지 여부를 덤프 핵심입니다.는 경우에 당신은 유형

ulimit -c unlimited

그 다음 말할 것이 강타하는 프로그램할 수 있는 덤프 코어의 크기입니다.크기를 지정할 수 있습 같은 52M 대한 당신이 원하는 경우,그러나 실제 이 필요는 없기 때문 크기의 핵심일 것입니다 아마 전혀 문제가 되지 않습니다.

에 tcsh,당신은 유형

limit coredumpsize unlimited

다른 팁

위에서 설명한 바와 같이 실제문 요청을 받고 여기에 사용하는 방법은 핵심 덤프 시스템에서 그들이 어디에 사용되지 않습니다.는 질문에 여기에 응답합니다.

는 경우 당신은 여기에 와서 희망을 생성하는 방법에 대해 알아보기 core dump 에 대한 응답이 없는 프로세스 응답이

gcore <pid>

는 경우 회사는 사용할 수 없 시스템에서 다음

kill -ABRT <pid>

를 사용하지 않는 kill-SEGV 으로는 수시로 불러오는 신호 처리기 어렵게 만들기 진단이 붙어 프로세스

무엇을 했는지 끝에 연결 gdb 하세요,그리고 그 때 그것을 가지고 나는 세그멘테이션 실행 generate-core-file 명령입니다.강제의 차세대 핵심 덤프.

을 확인하는 핵심 덤프가 생성되고,실행:

sysctl kernel.core_pattern

또:

cat /proc/sys/kernel/core_pattern

%e 프로세스 이름과 %t 시스템의 시간입니다.에서 변경할 수 있습니다 /etc/sysctl.conf 시하여 sysctl -p.

면 코어 파일이 생성되지 않습니다(시험에 의해 그것: sleep 10 &killall -SIGSEGV sleep)확인,제한: ulimit -a.

는 경우 core 파일 크기 제한을 실행합니다.

ulimit -c unlimited

그것을 무한합니다.

다음 다시 테스트,경우에는 핵심덤핑에 성공,당신이 볼 것이다"(core 덤프)후"구분류 표시를 아래와 같:

분류:11(core 덤프)

도 참조하십시오: 핵심을 버려진-그러나 코어 파일이 현재 디렉토리?


Ubuntu

우분투에서 핵심 덤프를 처리 표준입력에서 읽고 표준출 고에 있을 수 있습니다 /var/crash/.그러나,그것은 장애인에서는 기본적으로 안정되어 있다.

좀 더 자세한 사항은 체크인: 어디에서 찾을 수 있 core dump 우분투에서?.

macOS

MacOS 참조하십시오: 는 방법을 생성하는 핵심 덤프 Mac OS X?

어쩌면 당신은 그것을 할 수 있는 이 방법으로,이 프로그램하는 방법을 보여 트랩 세그먼트 오류와 껍질을 디버거(이것은 원래 코드에 사용됩 AIX 고)인쇄물 스택 추적 시점까지의 segmentation fault.당신을 변경해야합니다 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 */
}

야 할 수 있습니다 또한 추가 매개 변수를 얻는 gdb 을 덤프하는 핵심과 같이 여기에는 이 블로그 .

는 더 많은 것이있 영향을 미칠 수 있습니다 세대의 핵심 덤프.가 이러한:

  • 디렉토리에 대한 덤프 쓰기 가능해야 합니다.기본적으로 이의 현재 디렉터리 프로세스,하지만 그에 따라 변동될 수 있습니다 설정 /proc/sys/kernel/core_pattern.
  • 일부 조건에서,커널에서 값 /proc/sys/fs/suid_dumpable 지 못할 수 있습니다 핵심을 생성됩니다.

더 많은 상황을 방지할 수 있는 세대에 설명되어 있는 남자 페이지-도 man core.

을 활성화하기 위해 핵심 덤프 다음을 수행:

  1. /etc/profile 댓글 라인:

    # ulimit -S -c 0 > /dev/null 2>&1
    
  2. /etc/security/limits.conf 댓글 라인:

    *               soft    core            0
    
  3. 실행 cmd limit coredumpsize unlimited 고 그것을 검사 cmd 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
    #
    
  4. 는지 확인하려면 corefile 쓸 당신을 죽일 수 있습에 관련된 프로세스 cmd kill -s SEGV <PID> (하지 않아야 될 필요한 경우에 없는 코어 파일이 서면으로 사용할 수 있습니다 검사):

    # kill -s SEGV <PID>
    

면 corefile 가 기록되었는지 확인을 비활성화하고 코어 덤프 다시 설정에 관한 파일(1./2./3.) !

을 위한 우분투 14.04

  1. 체크 core dump 사용:

    ulimit -a
    
  2. 중 하나 줄이 포함되어야 합니다:

    core file size          (blocks, -c) unlimited
    
  3. 그렇지 않을 경우:

    gedit ~/.bashrc 며 추가 ulimit -c unlimited 하는 파일의 끝과 저장,다시 실행하여 터미널도 있습니다.

  4. 를 구축 응용 프로그램으로 디버깅 정보:

    에 Makefile -O0 -g

  5. 응용 프로그램을 실행하는 core dump(core dump 파일의 이름'코어'해야 만 근처 응용 프로그램 이름은 파일):

    ./application_name
    
  6. 에서 실행 gdb:

    gdb application_name core
    

기본적으로 당신을 얻을 것이 핵심은 파일입니다.는지 확인하십시오 현재 디렉터리 프로세스의 쓰기 가능한 또는 코어 파일이 생성됩니다.

시키기 위해 다양한 기능을에서 핵심 덤프 프로그래밍 방식으로 사용하는 시스템호출 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));
}

기다립니다.그것은 자동적으로 않습니다.을 만들 필요가 없습니다

그것은 언급 할 가치가있는 경우 systemd 설정,다음 것은 조금 다릅니다.설정 일반적으로 핵심을 파일이 파이프,에 의하여 core_pattern sysctl 값을 통해, systemd-coredump(8).Core 파일의 크기 rlimit 일반적으로로 구성된"무한한"이미 이다.

그 다음이 가능하여 검색하는 핵심 덤프를 사용하여 coredumpctl(1).

저장소의 핵심 덤프,등등.여 구성 coredump.conf(5).의 사례가 있는 어떻게 핵심을 얻을 수있는 파일에서 coredumpctl 남자 페이지가 있지만,그러나,그것은 다음과 같이 보일 것입니다.

핵심 file:

[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

을 얻을 핵심 file:

[vps@phoenix]~$ coredumpctl -o test_me.core dump 16163
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top