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?


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").


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.