2011-01-31 3 views
3

나는 프로그램이있어 kill -STOP에 의해 중지되었다. 나는 그것을 실행하지 않고 코어 덤프를하고 싶다 (프로그램은 모든 시간 동안 중지되어야하며, SIGCONT를 받으면 코어 덤프없이 죽을 것이다). 코어 덤프를 얻으려면 어떻게해야합니까?중지 된 프로그램 (리눅스)에서 코어 덤프를 얻는 방법

코어 덤프를 복용 한 후 프로그램을 현재 상태로 유지할 수 있습니까? 그것은 매우 드문 상황이며 재현 할 수는 없지만 분석해야합니다.

감사

업데이트합니다 gcore 명령이 작동하지 않습니다. Gdb (짝수 루트)는 중지 된 프로세스에 연결할 수 없습니다 (ptrace PTRACE_ATTACH에서 영원히 기다림). dd조차도/proc/99999/mem을/proc/99999/maps에서 좋은 오프셋으로 읽을 수 없습니다 (오류는 No such process입니다). 내가 GDB로 이동하여 코어를 저장하면

내가 처리하고 중지 프로세스에 SIGCONT를 보내도록 GDB를 연결하려고하면

, 나는

path... linux-nat.c:####: internal-error: linux_nat_attach: Assertion `pid == GET_PID (inferior_ptid) && WIFSTOPPED (status) && WSTOPSIG (status) == SIGSTOP' failed. 
A problem internal to GDB has been detected, 
further debugging may prove unreliable. 
A problem internal to GDB has been detected, 
further debugging may prove unreliable. 

을 가지고, 그것은 손상됩니다. "메모리에서 유효한 개체 파일 이미지를 읽지 못했습니다."

답변

6

gdb을 사용하여 현재 프로세스에 연결하고 generate-core-file 명령을 실행하십시오.

또는 gcore을 실행하고 프로세스 ID를 매개 변수로 제공 할 수 있습니다.

+0

시작하지 않고 프로세스에서 분리 할 수 ​​있습니까? (분리 후 멈추길 원합니다) – osgx

+0

네, 시작하지 않아도됩니다. 코어 파일을 원한다면'gcore'가 가장 쉽기 때문에 기존 프로세스를 전혀 망치지 마십시오. –

+0

gcore가 중지 된 프로세스에서 작동하지 않습니다^( – osgx

0

중단 된 ABRT 신호를 처리 한 다음 CONT로 다시 시작하십시오. 그것은 핵심을 버리고 중단 될 것입니다.

프로세스를 다시 시작하는 경우 어떤 이유로 든 옵션이 아니므로 pseudofile/proc/[pid]/mem을 검사 해 볼 수는 있지만 코어 형식이 아니므로 유용하지 않습니다.

+0

proc/pid/mem을 덤프하려면 맵을 사용해야합니다 proc/pid/mem에서 그냥 매핑 된 영역을 읽으시겠습니까? – osgx

+0

ABRT는 작동하지 않습니다. 왜냐하면이 프로세스에는 ulimit -c = 0이 있다고 생각하기 때문입니다. – osgx