Core dump

Origem: Wikipédia, a enciclopédia livre.
Ir para: navegação, pesquisa
O despejo de memória tem esse nome devido as antigas tecnologias de memória usando pequenos núcleos magnéticos mostrados aqui ampliados 50 vezes.

Na computação, Despejo de Núcleo (do inglês, Core Dump), mais apropriadamente chamado de Despejo de Memória, consiste no estado da memória em funcionamento de um programa de computador no exato momento onde, geralmente, o programa termina com falha de sistema (crash). O nome vem dos tempos onde a Memória de Ferrite era usada, antes da introdução da Memória Semicondutora. O nome se manteve em sistemas baseados em UNIX mesmo após muito tempo que a tecnologia caiu em desuso. Na prática, outras peças-chave do programa são despejadas ao mesmo tempo, incluindo os registradores do processador, que podem incluir os contadores do programa e a pilha de chamada, informações do gerenciamento de memória e outras flags e informações do processador e do sistema operacional. Despejos de memória são geralmente usados para auxiliar no diagnóstico e na depuração de erros em programas de computador.

Em muitos sistemas operacionais, um erro fatal em um programa inicia um despejo de memória. Devido à isso, a frase "core dump" começou a significar, em muitos casos, qualquer erro fatal, independente de se gravar um registro em memória dos resultados do programa.

O termo despejo de núcleo, despejo de memória ou somente despejo vem do jargão para indicar qualquer conjunto de dados cru para examinação.

Contexto[editar | editar código-fonte]

Antes do advento do sistemas operacionais em disco e a habilidade de gravar grande arquivos de dados, despejos de memória eram impressões de papel do conteúdo da memória, tipicamente organizados em colunas de números octais ou hexadecimais (um "hex dump), algumas vezes acompanhados pelas suas interpretações em instruções de linguagem de máquina, cadeia de caracteres (strings) ou números em ponto flutuante. Nos mais recentes sistemas operacionais, um despejo de memória é um arquivo contendo a imagem da memória de um processo em particular ou a imagem de partes do endereço desses processos junto com outras informações como o valor dos registradores do processador. Esses arquivos podem ser impressos ou vistos como texto, ou analisados com ferramentas especializadas, como o objdump.

Usos do despejo de memoria[editar | editar código-fonte]

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).[1]

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.[2]

Arquivos de Despejo de Memória[editar | editar código-fonte]

Formato[editar | editar código-fonte]

Nos antigos e simples sistemas operacionais, cada processa tinha um espeça de endereçamento adjacente, então um arquivo 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[editar | editar código-fonte]

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

Referências[editar | editar código-fonte]

  1. Venkateswaran, Sreekrishnan. Essential Linux device drivers. [S.l.]: Prentice Hall, 2008. 714 pp. p. 623. ISBN 9780132396554 Página visitada em 2010-07-15.
  2. Fedora Documentation Project. Fedora 13 Security Guide. [S.l.]: Fultus Corporation, 2010. 212 pp. p. 63. ISBN 9781596822146 Página visitada em 2010-09-29.

Ligações externas[editar | editar código-fonte]

Descrição para formato de arquivos:

Ver também[editar | editar código-fonte]