프로세스를 종료하지 않고 프로세스 코어 덤프


12

실제로 프로세스를 종료하지 않고 프로세스에 대한 코어 덤프 (또는 유사한 것)를 얻는 방법이 있습니까? 임베디드 시스템에서 멀티 스레드 파이썬 프로세스가 실행 중입니다. 그리고 정상적인 조건에서 프로세스의 스냅 샷을 얻을 수 있기를 원하지만 (예 : 다른 프로세스가 실행되어야 함) 파이썬 프로세스없이 gdb를 연결하거나 gdb에서 실행할 메모리가 충분하지 않습니다. 유일하게 달리는 것.

이 질문이 이해되기를 바랍니다.


이것이 디버깅하는 동안에 만 발생하는 경우 NFS 파일 또는 네트워크 블록 장치의 스왑과 같은 미친 것을 고려 했습니까?
Gilles 'SO- 악마 그만해'

답변:


13

일반적인 트릭은 무언가를 (아마도 같은 신호 SIGUSR1) 프로그램을 트리거 fork()한 다음 자식 abort()이 스스로 코어를 덤프하도록 호출 하는 것입니다.

from os import fork, abort
(...)
def onUSR1(sig, frame):
    if os.fork == 0:
        os.abort

초기화하는 동안

from signal import signal, SIGUSR1
from wherever import onUSR1
(...)
signal.signal(signal.SIGUSR1, wherever.onUSR1)

이 방법을 사용하면 fork거의 모든 주소 공간이 공유되므로 코어 메모리를 많이 생성하기 때문에 추가 메모리를 많이 사용하지 않습니다.

옛날 옛적에이 트릭은 undump복잡한 초기화 후 이미지를 저장하기 위해 코어 덤프에서 실행 파일을 생성하는 프로그램과 함께 사용되었습니다 . emacs에서 사전로드 된 이미지를 생성하는 데 사용됩니다 temacs.


5

을 사용해보십시오 gcore. 그게 당신을위한 옵션입니까?


언젠가 gcore는 독립형 프로그램이지만 gdb 패키지의 일부라고 생각하지 않습니다. 그러나 gdb --pid = <PID>를 실행 한 다음 gcore 명령을 사용하여 코어 파일을 덤프 할 수 있습니다. gcore.c는 더 가벼운 프로그램을 원한다면 쉽게 뒤섞 일 수있는 상당히 간단한 프로그램입니다.
신디사이저
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.