Despejo principal não-bloqueante no Linux?

23

Estou procurando uma maneira de obter um coredump não invasivo de um processo em execução no Linux.

Estou familiarizado com gcore do gdb, mas isso só pode ser executado quando gdb está anexado ao processo e é interrompido para depuração. Para um grande despejo principal, isso pode significar muitos segundos, ou mesmo alguns minutos, de execução interrompida.

Existe alguma alternativa sem bloqueio?

O Linux suporta memória copy-on-write, na qual ele depende para suportar fork() sem exec() . Então, estou pensando em algo no nível do kernel, no qual o kernel faz um snapshot de copy-on-write das tabelas da página de processo do processo sendo descartado e, em seguida, grava o núcleo enquanto o processo original continua em execução.

Tenho certeza que eu poderia usar gdb para forçar um fork() e depois despejar o filho enquanto o pai continua feliz, então wait() no pai para colher o filho após o término. É confuso, porém, e ainda requer duas interrupções do processo pai, ainda que curtas.

Certamente alguém precisou disso antes?

    
por Craig Ringer 11.09.2014 / 08:36

1 resposta

1

Google CoreDumper vem à mente. Faz uma cópia em cópia do espaço de endereço do processo, consulte WriteCoreDump () ( veja "Notas").

    
por 12.11.2014 / 00:10