Core dump (Português)

From ArchWiki
Status de tradução: Esse artigo é uma tradução de Core dump. Data da última tradução: 2020-09-14. Você pode ajudar a sincronizar a tradução, se houver alterações na versão em inglês.

Um despejo de núcleo (core dump) é um arquivo que contém o espaço de endereço de um processo (memória) quando o processo termina inesperadamente. Despejos de núcleo podem ser produzidos sob demanda (como por um depurador), ou automaticamente após o encerramento. Despejos de núcleos são acionados pelo kernel em resposta a travamentos do programa e podem ser passados para um programa auxiliar (como systemd-coredump) para processamento posterior. Um despejo de núcleo não é normalmente usado por um usuário médio, mas pode ser repassado aos desenvolvedores mediante solicitação, onde pode ser inestimável como um instantâneo post-mortem do estado do programa no momento da falha, especialmente se a falha for difícil de reproduzir de forma confiável.

Desabilitando automaticamente despejos de núcleo

Os usuários podem desejar desativar os despejos de núcleo automáticos por uma série de razões:

  • Desempenho: gerar despejos de núcleo para processos com muita memória pode desperdiçar recursos do sistema e atrasar a limpeza da memória.
  • Espaço em disco: os despejos de núcleo de processos com muita memória podem consumir espaço em disco igual, senão maior, que a área de cobertura da memória do processo se não for compactado.
  • Segurança: despejos de núcleo, embora normalmente legíveis apenas pelo root, podem conter dados confidenciais (como senhas ou chaves criptográficas), que são gravados no disco após um travamento.

Usando sysctl

sysctl pode ser usado para definir o kernel.core_pattern para nada para desabilitar o tratamento de despejo de núcleo. Crie este arquivo[1]:

/etc/sysctl.d/50-coredump.conf
kernel.core_pattern=|/bin/false

Para aplicar a configuração imediatamente, use sysctl:

# sysctl -p /etc/sysctl.d/50-coredump.conf

Usando systemd

O comportamento padrão do systemd é gerar despejos de núcleo para todos os processos em /var/lib/systemd/coredump. Este comportamento pode ser substituído criando um trecho de código de configuração no diretório /etc/systemd/coredump.conf.d/ com o seguinte conteúdo[2][3]:

/etc/systemd/coredump.conf.d/custom.conf
[Coredump]
Storage=none
Nota: Não esqueça de incluir o nome de seção [Coredump], do contrário esta opção será ignorado: systemd-coredump[1728]: [/etc/systemd/coredump.conf.d/custom.conf:1] Assignment outside of section. Ignoring.

Em seguida, recarregue a configuração do systemd.

# systemctl daemon-reload

Este método sozinho geralmente é suficiente para desabilitar os despejos de núcleo do espaço do usuário, contanto que nenhum outro programa habilite os despejos de núcleo automáticos no sistema, mas o despejo de núcleo ainda é gerado na memória e na execução de systemd-coredump.

Usando limites do PAM

O tamanho máximo de despejos de núcleo para usuários autenticados via PAM é imposto por limits.conf. Definir como zero desabilita os despejos com núcleo inteiramente. [4]

/etc/security/limits.conf
* hard core 0

Usando ulimit

Shells de linha de comando como bash ou zsh fornecem um comando embutido ulimit que pode ser usado para relatar ou definir limites de recursos do shell e os processos iniciados pelo shell. Veja bash(1) § SHELL BUILTIN COMMANDS ou zshbuiltins(1) para detalhes.

Para desabilitar despejos de núcleo na shell atual:

$ ulimit -c 0

Fazendo um despejo de núcleo

Para gerar um despejo de núcleo de um processo arbitrário, primeiro instale o pacote gdb. Em seguida, encontre o PID do processo em execução, por exemplo com pgrep:

$ pgrep -f firefox
2071 firefox

Anexe ao processo:

$ gdb -p 2071

Então, no prompt (gdb):

(gdb) generate-core-file
Saved corefile core.2071
(gdb) quit

Agora, você tem um arquivo de despejo de núcleo chamado core.2071.

Aonde eles vão?

O sysctl kernel.core_pattern decide aonde os despejos de núcleo automáticos vão. Por padrão, despejos de núcleo são enviados para systemd-coredump que pode ser configurado em /etc/systemd/coredump.conf. Por padrão, todos os despejos de núcleo são armazenados em /var/lib/systemd/coredump (por causa de Storage=external) e eles são compactados com lz4 (por causa de Compress=yes). Adicionalmente, vários limites de tamanho para o armazenamento podem ser configurados.

Nota: O valor padrão para kernel.core_pattern é definido em /usr/lib/sysctl.d/50-coredump.conf. Este arquivo pode ser mascarado ou substituído para usar uma configuração diferente segundo as regras normais de sysctl.d(5).

Para obter um despejo de núcleo do journal, veja coredumpctl(1).

Examinando um despejo de núcleo

Use coredumpctl para localizar um despejo correspondente:

# coredumpctl list

Você precisa identificar exclusivamente o despejo relevante. Isso é possível especificando um PID, nome do executável, caminho para o executável ou um predicado journalctl (consulte coredumpctl(1) e journalctl(1) para detalhes) Para ver detalhes dos despejo de núcleo:

# coredumpctl info correspondência

Preste atenção à linha "Signal", que ajuda a identificar a causa do travamento. Para uma análise mais profunda, você pode examinar o backtrace usando gdb:

# coredumpctl gdb correspondência

Quando gdb é iniciado, use o comando bt para imprimir o backtrace:

(gdb) bt

Veja Depuração - Obtendo Rastros se símbolos de depuração forem solicitados, mas não encontrados.

Limpeza de arquivos de despejo de núcleo

Os arquivos de despejo de núcleo armazenados em /var/lib/systemd/coredump/ serão limpados automaticamente por systemd-tmpfiles --clean, que é acionado diariamente com systemd-tmpfiles-clean.timer. Despejos de núcleo são configurados para persistir por pelo menos 3 dias, veja systemd-tmpfiles --cat-config.

Veja também