Despejar o núcleo do processo sem interromper o processo

12

Existe uma maneira de obter um dump principal (ou algo semelhante) para um processo sem realmente matá-lo? Eu tenho um processo python multithread em execução em um sistema incorporado. E eu quero poder obter uma captura instantânea 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 no gdb) sem o processo python sendo o único em execução.

Espero que essa pergunta faça sentido.

Falmarri
fonte
Se isso é apenas enquanto você está depurando, você considerou algo louco como a troca em um arquivo NFS ou em um dispositivo de bloco de rede?
Gilles 'SO- stop be evil' -

Respostas:

13

O truque usual é ter algo (possivelmente como um sinal SIGUSR1) para acionar o programa e fork(), em seguida, a criança chama abort()para fazer o núcleo de despejo.

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 maneira, forknão consumirá muita memória extra, pois quase todo o espaço de endereço será compartilhado (e é também por isso que isso funciona para gerar o dump principal).

Uma vez, esse truque foi usado com um programa chamado undumppara gerar um executável a partir de um core dump para salvar uma imagem após uma inicialização complexa; emacscostumava fazer isso para gerar uma imagem pré-carregada temacs.

geekosaur
fonte
5

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

Leonid
fonte
Em algum momento, o gcore era um programa independente, mas acho que não faz mais parte do pacote gdb - no entanto, você pode executar o gdb --pid = <PID> e, em seguida, usar o comando gcore para despejar um arquivo principal. O gcore.c é um programa bastante simples e facilmente googlable se você quiser algo mais leve.
Synthesizerpatel