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)