Jump to content
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(8)) 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 (coredump.conf(5) § DESCRIPTION, [2]):

    /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. [3]

    /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

- american fuzzy lop - Uma ferramenta para testes automatizados do kernel e de programas
- Filesystem fuzzing - Artigo da LWN sobre teste de sistemas de arquivos em busca de bugs

Categories:

- Development (Português)
- Security (Português)