mmap() 실패: 메모리를 할당할 수 없습니다. 누가 불평하는지 어떻게 알 수 있습니까?

mmap() 실패: 메모리를 할당할 수 없습니다. 누가 불평하는지 어떻게 알 수 있습니까?

mmap()이 갑자기 .xsession-errors에 실패했습니다. 그러나 어떤 응용 프로그램이 실패했는지 표시는 없습니다. 그런 일이 발생한 후에는 어떻게 조사해야 합니까? 나는 보통 가끔 "tail -f .logs/*" 작업공간으로 전환할 때만 실패를 인지합니다.

답변1

당신은 그것을 사용할 수 있습니다시스템 클릭이런 일을 위해서.

  • 먼저 시스템을 설정하세요. SystemTap, 실행 중인 커널에 해당하는 헤더 및 디버깅 기호가 필요합니다. 데비안에서 작동시키는 방법은 다음과 같습니다:

    sudo apt-get install systemtap
    sudo apt-get install linux-headers-$(uname -r)
    sudo apt-get install linux-image-$(uname -r)-dbg
    

    커널 헤더와 기호가 실행 중인 커널과 정확히 일치해야 하기 때문에 작동시키는 것은 약간 까다로울 수 있습니다. Gentoo에서는 일이 간단하고 간단해지기를 바랍니다.

  • 그런 다음 이 파일을 다음과 같이 저장합니다 mmap.stp.

    #! /usr/bin/env stap
    # -*- systemtap -*-
    
    global last_args
    
    probe syscall.mmap2 {
            last_args[tid()] = argstr;
    }
    
    probe syscall.mmap2.return {
            errno = errno_p(returnval())
            if (errno != 0) {
                    printf("%s[%d] mmap2(%s) failed: %d (%s)\n",
                           execname(), pid(), last_args[tid()],
                           errno, errno_str(errno));
            }
    }
    
    probe begin {
            printf("begin\n");
    }
    
    probe end {
            printf("end\n");
    }
    
  • 실행해

    sudo stap mmap.stp
    

컴파일 및 인쇄 후에는 begin각 시스템 호출을 모니터링 mmap()하고 해당 인수를 저장합니다. 오류가 발생하면 프로그램 이름, 프로세스 ID, 매개변수 및 오류 코드를 포함한 출력이 표시됩니다. 예를 들어, 다음 말도 안되는 프로그램을 실행해 보세요:

int main() {
        mmap(1,-1,123,0,1,0);
}

SystemTap 출력을 제공합니다.

test[9601] mmap2(0x1, 4294967295, PROT_READ|PROT_WRITE|PROT_SEM|0x70, 0x0, 1, 0) failed: 22 (EINVAL)

관련 정보