[ 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
|