# Despejo de memória

Em computação, um despejo de núcleo, despejo de travamento, despejo de memória ou despejo de sistema consiste do estado gravado da memória de trabalho de um programa de computador em um momento específico, geralmente quando o programa trava ou quando foi encerrado de maneira anormal. Na prática, outras partes importantes do estado do programa são geralmente despejadas no mesmo momento, incluindo os registros do processador, que podem incluir o contador de programa e o ponteiro da pilha, informações de gerenciamento de memória e outros sinalizadores e informações do processador e do sistema operacional. Um despejo instantâneo (snapshot dump ou snap dump) é um despejo de memória solicitado pelo operador do computador ou pelo programa em execução, após o qual o programa pode continuar. Os despejos de núcleo são usados ​​frequentemente para auxiliar no diagnóstico e na depuração de erros em programas de computador.
O nome vem da memória de núcleo magnético, a principal forma de memória de acesso aleatório das décadas de 1950 a 1970. O nome permaneceu por muito tempo depois que a tecnologia do núcleo magnético se tornou obsoleta.
Em muitos sistemas operacionais, um erro fatal em um programa aciona automaticamente um despejo de núcleo. Por extensão, a frase "despejar o núcleo" passou a significar, em muitos casos, qualquer erro fatal, independentemente de um registro dos resultados da memória do programa. O termo "despejo de núcleo", "despejo de memória", ou apenas "despejo", também se tornou um jargão para indicar qualquer armazenamento de uma grande quantidade de dados brutos para um exame mais aprofundado ou outros propósitos.

## Contexto

Os primeiros despejos de núcleo foram impressões de papel do conteúdo da memória, normalmente organizadas em colunas de números octais ou hexadecimais (um "hex dump"), às vezes acompanhadas de suas interpretações como instruções em linguagem de máquina, cadeias de texto ou decimais ou números de pontos flutuantes (cf. desmontador).
À medida que os tamanhos de memória aumentavam e os utilitários de análise post mortem eram desenvolvidos, os despejos eram gravados em mídias magnéticas como fita ou disco.
Em vez de exibir apenas o conteúdo da memória aplicável, os sistemas operacionais modernos geralmente geram um arquivo contendo uma imagem da memória pertencente ao processo travado, ou as imagens de memória de partes do espaço de endereço relacionadas a esse processo, juntamente com outras informações como os valores de registros do processador, contador de programas, sinalizadores do sistema e outras informações úteis para determinar a causa raiz do travamento. Esses arquivos podem ser visualizados como texto, impressos ou analisados ​​com ferramentas especializadas como o elfdump em sistemas Unix e tipo Unix, objdump e kdump no Linux, WinDbg no Microsoft Windows, Valgrind ou outros depuradores.
Arquivos modernos de despejo de núcleo e mensagens de erro normalmente usam codificação hexadecimal, já que as representações decimal e octal são menos convenientes para o programador.

## Usos do despejo de memória

Despejos de memória podem servir como úteis assistentes de depuração em muitas situações. No início dos sistemas batch, despejos de memória eram forçados pelo usuário para depurar um programa sem monopolizar os (muito caros) programas de depuração. Uma impressão poderia ser mais conveniente que depurar usando interruptores e lâmpadas. Em computadores compartilhados, seja de tempo compartilhado, processamento batch ou servidores, despejos de memória permitem uma depuração offline do sistema operacional, então esse sistema pode voltar à operação imediatamente. Despejos de memória permite a um usuário salvar um erro para posterior análise ou comparação com outros erros. Para computadores embarcados é impraticável a depuração no computador em si, então a análise de um despejo precisa ser feito em um computador diferente. Alguns sistemas operacionais como as primeiras versões do Unix não davam suporte para depuradores acoplados na execução de processos, então os despejos de memória são necessário para rodar um depurador no conteúdo de memória do processo. Despejos de memória podem ser usadas para capturar dados liberados durante uma alocação dinâmica de memória e podem também ser usados para recuperar informações de um programa que não está mais rodando. Na ausência de um depurador interativo, o despejo de memória pode ser usado por programadores experientes para determinar o erro para examinação direta.
Um despejo de memória representa o conteúdo completo da região despejada do espaço de memória do processo. Dependendo do sistema operacional, o despejo pode conter algumas ou nenhuma estrutura de dados para ajudar a interpretação das regiões da memória. Nesses sistemas, uma interpretação bem-sucedida exige que o programa ou usuário entenda a estrutura de uso da memória do programa.
Um depurador pode usar um tabela de símbolos, se existir uma, para ajudar o programador a interpretar os despejos, identificando variáveis simbólicas e exibindo o código fonte. Se a tabela de símbolos não estiver disponível, menos interpretação do despejo é possível, mas isso pode ser o suficiente para determinar a causa do problema. Também existem ferramentas para especializada chamada Analisadores de Despejo para analisar o erro.
Nos sistemas operacionais modernos baseados em Unix, administradores e programadores podem ler o despejo de memória usando a biblioteca GNU Binutils Binary File Descriptor (BFD) e o GNU Debugger (gdb) e objdump que usa essa mesma biblioteca. Essas bibliotecas irão fornecer os dados cru para um dado endereço na região do despejo de memória. Isso não mostra nada sobre variáveis ou estrutura de dados naquela região da memória, então a aplicação usará a biblioteca para ler o despejo de memória e terá que determinar o espaço de endereçamento das variáveis e o layout das estrutura de dados, por exemplo, utilizando a tabela de símbolos para o programa sofrendo a depuração.
Analistas de despejo de memória nos sistemas Linux podem usar o kdump ou o Linux Kernel Crash Dump (LKCD).
Despejos de memória podem salvar o contexto (estado) de um processo e retornar esse estado depois. Sistemas podem ser feito altamente disponíveis para transferir o núcleo entre processadores, algumas vezes arquivos despejo de memória via eles mesmo.
Núcleos também podem ser despejados e um host remoto via rede.

## Arquivos de Despejo de Memória
### Formato

Nos antigos e simples sistemas operacionais, cada processador tinha um espaço de endereçamento adjacente, então um arquivo de despejo de memória era simplesmente um arquivo binário com a sequência desses bytes ou palavras. Nos sistemas operacionais modernos, um espaço de endereçamento pode ter espaços e compartilhar páginas com outros processos ou arquivos, então as mais elaboradas representações são usadas. Elas podem incluir outras informações sobre o estado do programa no momento do despejo.
Nos sistemas baseados em Unix, despejos de memória geralmente usam o padrão executável de formato de arquivos:
* a.out nas antigas versões do Unix,
* ELF nos Linux modernos, System V, Solares e sistemas BSD,
* Mach-O no Mac OS.

### Nomeando

* Despejos de memória de processos do usuário geralmente são criados como "core".
* Despejos de sistemas amplos baseados em Unix mais modernos, frequentemente aparecem como "vmcore" ou como "vmcore.incomplete".
* Sistemas como Microsoft Windows que usam extensões de arquivo podem usar a extensão ".dmp" (ex: "memoria.dmp" ou "Minidump\Mini051509.dmp")