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
.