Despeje o núcleo do processo sem matar o processo

12

Existe uma maneira de obter um core dump (ou algo similar) para um processo sem realmente matar os processos? Eu tenho um processo python multithread executado em um sistema incorporado. E eu quero ser capaz de obter um instantâneo do processo em condições normais (ou seja, com os outros processos necessários para execução), mas não tenho memória suficiente para conectar o gdb (ou executá-lo em gdb) sem o processo python sendo o único a correr.

Espero que esta pergunta faça sentido.

    
por Falmarri 12.04.2011 / 21:06

2 respostas

13

O truque comum é ter algo (possivelmente um sinal como SIGUSR1 ) acionando o programa para fork() , então o filho chama abort() para se tornar dump core.

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

e durante a inicialização

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

Usado dessa forma, fork não consumirá muita memória extra porque quase todo o espaço de endereço será compartilhado (e é por isso que isso funciona para gerar o dump principal).

Era uma vez esse truque foi usado com um programa chamado undump para gerar um executável a partir de um dump principal para salvar uma imagem após uma inicialização complexa; emacs costumava fazer isso para gerar uma imagem pré-carregada de temacs .

    
por 12.04.2011 / 21:23
5

Você pode tentar usar gcore . Isso é uma opção para você?

    
por 17.02.2013 / 17:49