[ UNIX ] 

Como são gerados e o que são core dump  



Data do Documento: 05/01/2000 
Ultima atualização: 05/01/2000 
Palavras Chave: unix, core dump, sinal, processos 
Autor: Verdade @bsoluta 
Tradutor
Arquivo: entra_sai_unix.htm 
Status: completo 

Comentários e correções são sempre bem-vindos.


Quando o kernel envia um sinal o mesmo determina o tipo do sinal e "desliga" os os bits de sinais apropriados na tabela de processos. Se a função de envio de sinal for setada para o valor default, o kernel, antes de encerra o processo, gera um arquivo "core" com a imagem do processo . 
 
algorithm psig   /*  handle signals after recognizing their existence */ 
input:   none 
output: none 

   get signal number set in process table entry; 
   clear signal number in process table entry; 
   if (user had called signal sys call to ignore this signal) 
        return;     /*  done  */ 
   if (user specified function to handle the signal) 
      { 
        get user virtual address of signal catcher stored in u area; 
        /* the next statement has undesirable side-effects */ 
        clear u area entry that stored address of signal catcher; 
        modify user level context: 
                           artificially create user stack frame to mimic 
                           call to signal catcher function; 
        modify system level context; 
                           write address of signal catcher into program 
                           counter field of user saved register context; 
        return; 
      } 
        if (signal is type that system should dump core image of process) 
      { 
         create file named "core" in current directory; 
         write contentes of user level context to file "core"; 
      } 
     invoke exit algorithm immediately; 
}
Os arquivos core são importantes para programadores, permitindo que este identifiquem causas de erro no processo de debug de programas. O kernel gera os core para sinais que indiquem alguma anomalia no sistema, como por exemplo um processo que execute uma instrução ilegal ou quando o mesmo acessa endereços fora do seu limite de endereços virtuais. Mas o kernel não gera core para sinais que não indiquem um erro de programa. Por exemplo, ao receber um sinal de interrupção enviado pelo usuário, isso implica que o usuário deseja terminar o processo prematuramente, este tipo de sinal não indica que alguma coisa esteja errada, porém existe uma forma de gerar core de forma proposital, isso é possível com o sinal de quit, através do conjunto de teclas Ctrl+\, isso gera um core do processo que está em execução. 

Para verificar qual é o conjunto de teclas setados no seu sistema digite o seguinte: 

% stty -a 
 
agora identifique que conjunto de teclas está associado ao quit

Para realizar uma analise de arquivos core inicialmente você pode usar o comando  "file" para identificar qual programa gerou o core: 

% ls -alp 
... 
-rw-------   1  frank   frank   90112  Jan  5  03:56  core 
... 

% file core 
core: ELF 32-bit LSB core file of  'ls'  (signal 3), Intel 80386, version 1 

Uma vez identificada a aplicação que gerou o core, no caso  "ls",  podemos usar o comando GDB - The GNU Debugger

% gdb ls core 
... 
Core was generated by  'ls  -alp'. 
Program terminated with signal 3, Quit. 
Reading symbols from /lib/libc.so.6...done. 
Reading symbols from /lib/ld-linux.so.2...done. 
Reading symbols from /lib/libnss_files.so.2...done. 
#0  0x400bb534  in __libc_read ( ) 
 (gdb) 

use "q", quit,  para encerrar o gdb. 

No caso do nosso exemplo nota-se que o core foi gerando devido a uma interrupção proposital do processo através do sinal de quit ( Ctrl+\ ). 

No caso de programadores que estão desenvolvendo aplicações o arquivo core pode ajudar na identificação do problema, para isso é fundamental que no momento da compilação o desenvolvedor informe uma opção do compilador para permitir que o mesmo escreva as informações de depuração no arquivo executável final; a opção  -g  faz com que o executável final contenha algumas informações adicionais que permitem ao depurador linkar instruções de máquina de volta com as linhas do código-fonte, use: 

% gcc  -g  programa.c -o programa 
 

Referência : 

  • The Design of the UNIX Operating System (ISBN - 0-13-201799-7)

<=

http://www.absoluta.org      ---oOo---      verdade@absoluta.org

Copyright © 1998 - 2000  Verdade @bsoluta