Despejo de núcleo sem bloqueio no Linux?

24

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

Eu estou familiarizado com o gdb's gcore, mas isso só pode ser executado quando gdbestá anexado ao processo e parado para depuração. Para um grande dump de núcleo, isso pode significar muitos segundos, ou até alguns minutos, de execução interrompida.

Existe alguma alternativa sem bloqueio?

Suportes Linux copiar-on-write memória, que se baseia na apoio fork()sem exec(). Então, estou pensando em algo no nível do kernel em que o kernel tira um instantâneo de cópia na gravação das tabelas da página do processo que está sendo despejado e, em seguida, grava o núcleo enquanto o processo original continua em execução.

Tenho certeza de que poderia usar gdbpara forçar um fork()despejo da criança enquanto o pai continua feliz, e depois wait()o pai colher o filho após o término. É uma bagunça, no entanto, e ainda requer duas interrupções do processo pai, ainda que curtas.

Certamente alguém já precisou disso antes?

Craig Ringer
fonte
Lamento poder dar apenas um voto positivo para esta pergunta maravilhosa.
peterh diz restabelecer Monica
Excelente pergunta e eu, por um lado, estou ansioso pela resposta. +1 de mim
thanasisk
1
Que tal 1) anexar o processo com o gdb 2) deixá-lo bifurcado por um comando "call fork" 3) despejar o núcleo do processo filho 4) deixar o filho morto ser esperado pelo pai (outro "call wait4") 5 ) desanexar do processo 6) automatizar 1-5? O Gdb usa chamadas simples do sistema sys_ptrace (), poderia ser uma ferramenta C não muito complexa e totalmente independente do gdb.
peterh diz restabelecer Monica
1
Em uma máquina virtual, você pode tirar uma captura instantânea e trazê-la como um clone para ser analisado. Talvez uma das ferramentas listadas aqui vai ajudá-lo: cyberciti.biz/programming/linux-memory-forensics-analysis-tools
Giovanni Tirloni
1
Você pode evitar a segunda interrupção fazendo com que o processo filho também bifurque e saia. Em seguida, o processo pai pode esperar o filho imediatamente e continuar, enquanto o avô despeja o núcleo.
precisa saber é o seguinte

Respostas:

1

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

EricM
fonte
Isso parece extremamente útil! Eu me pergunto qual é a técnica subjacente usada. Presumivelmente, ele segue o processo, mas a criação do instantâneo CoW sem bifurcação e de uma maneira que não afete a (s) pilha (s) seria um desafio. Vou ter que dar uma olhada no código. Ótima dica.
Craig Ringer
Parece que está apenas em processo, infelizmente, e não pode ser invocado via gdb ou similar porque requer o ptrace. Portanto, é um pouco como a DLL debughelp no Windows, e não como um gcore sem bloqueio, mas ainda com uma aparência muito útil. Eu acho que seria possível usar através de um gancho LD_PRELOAD e configurar um manipulador de sinal com gdb, desconectar e sinalizar o processo, mas não parece que ele tenha sido realmente projetado para despejar programas não modificados e que tenha o problema compartilhado por qualquer ferramenta de despejo em processo que, se o processo estiver estragado o suficiente, o despejo não funcionará.
Craig Ringer
Desculpe ... perdi o bit "não intrusivo" quando li a pergunta pela primeira vez.
EricM