2013-03-22 2 views
7

/proc/<pid>/status에 따라 현재 디스크 활동을 차단하고있는 실행중인 프로세스의 핵심을 덤프하려고합니다. 실제로, 그것은 GPU에 대한 작업을 수행하는 데 분주합니다 (4 시간의 작업을해야하지만, 지금은 상당히 오래 걸렸습니다). 프로세스의 작업이 얼마나 완료되었는지 알고 싶습니다. 따라서 프로세스의 메모리를 덤프 할 수 있으면 좋을 것입니다. 그러나 내가 아는 한 "디스크 활동 차단"은 어떤 방식 으로든 프로세스를 중단 할 수 없으며 프로세스를 코어 덤프하는 것을 의미합니다. gdb를 사용하려면 ptrace를 통해 연결하려면 프로세스를 중단하고 일시적으로 중지해야합니다.디스크 활동을 차단하고있는 프로세스를 코어 덤프 할 수 있습니까?

내가 단지 /proc/<pid>/{maps,mem}을 루트로 사용하여 (아마도 일관성이없는) 메모리 상태를 읽을 수 있음을 알고 있지만, 프로세스의 사용자 공간 CPU 레지스터 값을 유지할 수있는 방법을 모르겠다 ... 그 과정은 커널 내부에있다.

+0

소스 코드에서 매 30 분마다 레지스터를 인쇄 할 수 있습니다 .... – 0x90

+0

물론, 내 자신의 코어 덤프 메이커를 굴리는 것에 관한 것보다 기성의 솔루션에 대해 훨씬 행복 할 것입니다. : – thejh

+0

@ 0x90 맞습니다. 강제 재부팅 또는 9 시간의 계산 된 데이터를 잃어 버리거나 알 수없는 시간을 기다리고 싶지 않기 때문에 이미 실행중인 프로그램에서이 작업을 수행 할 수 있기를 바랍니다. 이 일은 (어딘가에 붙어 있지 않다면) 완료해야합니다. "매 30 분마다"하지 않을 것입니다. - 디스크에있을 수있는 (또는 막을 수있는) 방법을 입력하기 전에 항상해야합니다. "디스크 IO "를 추가로 사용함 – thejh

답변

3

gcore을 프로그램에서 실행할 수 있습니다. 이것은 기본적으로 GDB를 감싸는 랩퍼이며, gcore 명령을 사용하고 다시 연결됩니다.

이것은 신호를 수신 한 것처럼 IO를 방해 할 수 있지만 프로그램이 올바르게 작성되면 다시 시작될 수 있습니다 (기본 처리로 인해 어떤 경우에도 발생할 수 있음).

+0

부수적으로, 간단한 hello world 유형의 프로그램으로이 작업을 시도했지만,'read()'에 대한 호출이 자동으로 재개되었습니다. – Hasturkun

+0

멋지다! 답변에 소스를 게시 할 수 있습니까? – Jess

+0

@Jessemon : 안녕하십니까? 기본적으로'char c; printf ("안녕하세요! \ n"), read (0, &c, 1);'내가 말했듯이, 아무것도 똑똑하지 않습니다.) – Hasturkun