2012-05-17 2 views
1

1) 내 데몬에 문제가 있습니다. 코어 벙어리 생성없이 시간이 추락했습니다. 시스템은 FreeBSD입니다. 항상 전에 .core가 생성되었습니다. 이것이 다른 종류의 오류이거나 다른 일이 발생하고 핵심이없는 상황 인 것 같습니다. 어쨌든 나는 이것을 알고 고치고 싶다!cpp gdb가 작동하지 않고 gdb가 작동하지 않는 문제가 발생했습니다.

2) 코어가 100 % 확실히 생성되어야 함을 FreeBSD에서 확인하는 방법은 무엇입니까? 여기 는 : How to generate a core dump in Linux when a process gets a segmentation fault?ulimit -c unlimited하지만 Command not found

3) 내가 GDB와 프로세스에 연결하는 데 필요한 오류/충돌을 잡을 것 같다 있다고? 그렇게하는 방법? 또한 유래에서 검색 및 설립 : gdb attach to a process without stop을하지만 난 괜찮아 않도록주의입니다 :

A) 나는 attach라는 파일이 실행이 라인을 추가 할 수있는 자신의 권리를 부여합니다

echo "cont" > attach.gdb 
gdb server $1 -x attach.gdb 
rm attach.gdb 

B를) ./attach 처럼 실행되고 시작되지만 아무 것도 할 수 없습니다. 그 권리? 데몬이 충돌하기 전에 기다려야합니다. 코어를 얻으려면 generate-core-file을 작성 하시겠습니까?

4) 디몬이 SEGFAIL 또는 다른 예외없이 종료하면 명령 generate-core-file에 의해 코어가 생성됩니까?

내 영어를 사용해 죄송합니다. 네이티브 언어가 아닌 커다란 메시지를 쓰기 어렵다. 당신은 이해하기가해야 ...

답변

1

3B)는 ./attach 1234를 실행하는 데 필요로하는 곳에 1234 실행중인 프로세스의 PID (PID는 GDB에 전달 될 스크립트에 $1 인수)

될 것 아니면 다음 명령 cont을 입력하고 충돌이 나올 때까지 기다리는 것이 연결 스크립트를 귀찮게 (꽤 무의미) 및 gdb server 1234를 실행하지 마십시오.

gdb가 연결되어있는 동안 충돌이 발생하면 왜 코어 파일이 필요합니까? 코어 파일의 이점은 디버거를 사용하여 검사하는 것이지만, 디버거 내부에서 충돌이 발생한 경우 직접 디버깅하면 코어 파일이 필요하지 않습니다! 그래서 generate-core-file을 잊어 버리고 충돌 할 때 직접 프로세스를 검사하십시오.

+0

감사합니다.하지만 하루 종일 gdb에서 데몬을 모니터 할 수 없기 때문에 .core 파일을 항상 유용하게 사용할 수 있습니다. 그리고 당신은 "아빠 일이 당신이 그들을 기대하지 않을 때 일어난다"고 가장 부적절한 순간을 알 것입니다. – abrahab

+1

당신은 그것을 모니터 할 필요가 없습니다. 그냥 달려 둘 수도 있지만, gdb 하에서는 훨씬 느리게 실행될 것입니다. 신호가 발생합니다. 나는 gdb 사용에 대해서만 3과 4에 대답했다.코어 파일을 얻지 못하는 이유를 알아 내기 위해 데몬의 종료 상태를 알 수 있습니다 (스크립트에서 실행하여 종료 한 후 $?를 출력하고 코어 파일이없는 이유를 확인하십시오). 파일을 쓸 수있는 권한이없는 디렉토리에서) –

+0

종료 상태를 얻는 방법에 대한 단계별 지침을 추가 할 수 있습니까? 내 질문에 같은 somethings 껍질 파일을 만듭니다. ./server | echo $> status.file? 추신. 아니, 나중에 SIGFAIL.에 기록 된 .core) – abrahab

1

프로세스로 인해 ulimit를 문제의 핵심하지 않은 경우 프로세스를 실행하기 전에 ulimit를 설정하는 작은 쉘 스크립트를 작성 :

이것은 당신이 당신의 프로그램에서 표준 출력 및 표준 오류를 캡처 할 수 있습니다
#! /bin/sh 
ulimit -c unlimited 
/path/to/my/program > program.out 2>&1 
echo $? >> program.out 

하고, 프로그램을 캡처하려면 program.out에 상태를 반환합니다. 이 파일의 크기를보아야 만합니다. 파일 시스템이 가득 차면 다른 파일 시스템이 손상 될 수 있습니다.

그렇기 때문에 코어를 얻지 못했습니다. 프로그램이 디버깅을 위해 컴파일되고 assert()를 실행하면 코어 링없이 종료됩니다. 종료하기 전에 프로그램에서 내용을 인쇄하거나 아무것도 기록합니까?

+0

freebsd : ulimit : 명령을 찾을 수 없습니다. – abrahab

관련 문제