Linux에서 비 차단 코어 덤프?


24

Linux에서 실행중인 프로세스의 비 침입 코어 덤프를 수행하는 방법을 찾고 있습니다.

gdb 's에 익숙 gcore하지만 gdb프로세스에 연결되어 있고 디버깅을 위해 중지 된 경우에만 실행할 수 있습니다 . 실행이 중단되는 데 몇 초 또는 몇 분이 걸릴 수있는 큰 코어 덤프의 경우.

비 차단 대안이 있습니까?

Linux는 COW (Copy-On-Write) 메모리를 지원하며이를 사용 fork()하지 않고 지원해야합니다 exec(). 그래서 커널이 덤프중인 프로세스의 프로세스 페이지 테이블에 대한 복사시 복사 스냅 샷을 작성한 다음 원래 프로세스가 계속 실행되는 동안 코어를 쓰는 커널 수준의 것을 생각하고 있습니다.

나는 부모가 행복하게 나아갈 때 아이 gdb를 강제 fork()로 버리고 아이를 버리기 wait()위해 부모를 데려 갈 수 있다고 확신 합니다. 그래도 지저분하지만 여전히 짧은 프로세스이지만 부모 프로세스의 두 가지 중단이 필요합니다.

누군가 전에 이것을 필요로 했습니까?


이 훌륭한 질문에 단 하나의 공감대를 줄 수있어서 유감입니다.
peterh는 모니카

훌륭한 질문과 나는 대답을 고대하고 있습니다. +1
thanasisk

1
1) gdb로 프로세스를 연결하는 방법 2) "콜 포크"명령으로 포크 처리 3) 자식 프로세스의 코어 덤프 4) 부모가 죽은 자식을 대기시키는 것 (또 다른 "콜 대기 4") 5 ) 공정에서 분리 6) 자동화 1-5? Gdb는 간단한 sys_ptrace () 시스템 호출을 사용하는데, gdb와는 완전히 독립적 인 C 툴이 아닙니다.
피터는 모니카

1
가상 머신에서 스냅 샷을 작성하고이를 분석 할 클론으로 가져올 수 있습니다. 여기에 나열된 도구 중 하나가 도움이 될 것입니다. cyberciti.biz/programming/linux-memory-forensics-analysis-tools
Giovanni Tirloni

1
하위 프로세스도 포크하고 종료하여 두 번째 중단을 피할 수 있습니다. 그런 다음 부모 프로세스는 자식을 즉시 기다렸다가 계속할 수 있지만 조부모는 코어를 덤프합니다.
kasperd

답변:


1

Google CoreDumper가 떠 오릅니다. 프로세스 주소 공간의 COW ( Copy-On-Write) 복사본을 만듭니다 (WriteCoreDump () 참조 ( "참고"참조)).


매우 유용하게 보입니다! 사용 된 기본 기술이 무엇인지 궁금합니다. 아마도 프로세스를 추적하지만, 분기하지 않고 스택에 영향을 미치지 않는 방식으로 CoW 스냅 샷을 만드는 것은 어려울 것입니다. 코드를 살펴 봐야합니다. 좋은 팁.
Craig Ringer

불행히도 처리 중에 만있는 것처럼 보이며 pdb 자체가 필요하기 때문에 gdb 또는 이와 유사한 것을 통해 호출 할 수 없습니다. 따라서 비 차단 gcore가 아니라 Windows의 debughelp DLL과 약간 비슷하지만 여전히 매우 편리합니다. LD_PRELOAD 후크 및 gdb로 신호 처리기 설정, 분리 및 프로세스 신호를 통해 사용할 수 있지만 실제로 수정되지 않은 프로그램을 덤프하도록 설계된 것처럼 보이지는 않습니다. 프로세스가 엉망인 경우 덤프가 작동하지 않는 프로세스 내 덤프 도구를 사용합니다.
Craig Ringer

죄송합니다… 질문을 처음 읽을 때 "비침 입적"비트를 놓쳤습니다.
EricM
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.