Como visualizar o arquivo Core (geral)

Como visualizar o arquivo Core (geral)

Cenário (Ubuntu 16.04):

Eu compilo e executo um programa C (com -g, obtenho o tradicional Segmentation Fault (core dumped)e então (é claro) não há nenhum arquivo "principal" mítico a ser encontrado. Algumas pesquisas dizem para modificar /proc/sys/kernel/core_patterncom um comando no sentido de: echo '|tee /home/me/my_core_folder/my_core_file' | sudo tee /proc/sys/kernel/core_patterne depois de fazer isso, paro de receber (core dumped)e começo apenas a obter o plain Segmentation Fault. Tento coisas como gdb ./program_object_file.out core.pidwhich obviamente não existem (estava ficando desesperado) e, claro, tento o plain gdb ./a.outseguido de (gdb) core core.pidvariantes dos comandos onde envio a tabchave desesperadamente tentando. obtenha o preenchimento automático para chegar onde preciso estar.

Pergunta:

Existe uma maneira generalizada de chegar aos core dumps? Reconheço que cada máquina que toco parece ter umTransformadores de Michael Bay-capacidade de reconfigurar hardware e software de forma que nenhum dispositivo que possuo funcione normalmente imediatamente. Existe um algoritmo/receita simples que eu possa seguir para localizar core dumps em minha própria máquina, bem como nas máquinas de outras pessoas? Eu sempre me pego dando aulas para amigos sobre coisas como essa depois de muito trabalho para fazer as coisas funcionarem para mim e seria bom poder executar um comando ou algo assim para fazer com que os arquivos principais fossem despejados no diretório de onde o executável foi executado. ... existe alguma maneira de fazer isso que funcione na maioria (eu me contentaria com "algumas") máquinas Linux/Unix?

Responder1

Ocore(5)A página de manual descreve detalhadamente os parâmetros que afetam os core dumps, incluindo sua nomenclatura, etc.

Para responder à sua pergunta, não há uma maneira generalizável de encontrar um core dump. Por padrão, o núcleo é despejado noprocessodiretório de trabalho atual, se o processo tiver permissão para gravar lá, se houver espaço suficiente no sistema de arquivos que o contém, se não houver dump principal existente (em algumas circunstâncias) e se o tamanho do arquivo e os limites de tamanho do arquivo principal (conforme definido por ulimitou mecanismos similares) permitem isso. Mas /proc/sys/kernel/core_patternfornece muitas maneiras diferentes de processar core dumps, então você realmente precisa analisar isso também e descobrir o que está acontecendo.

No seu caso, não sei por que o núcleo não foi encontrado inicialmente, mas sei por que você parou de obter núcleos depois de configurar o redirecionamento: ao usar um pipe in core_pattern, o programa de processamentodeveser especificado usando um nome de caminho absoluto. teepor si só não será usado; você precisa especificar /usr/bin/tee. Observe que você deve tomar cuidado especial com esse tipo de configuração em sistemas multiusuário, porque o programa executado para processar o core dump é executado como root.

Nos derivados do Debian eu instalocorekeeper, que grava core dumps de uma maneira facilmente utilizável em diretórios por usuário em /var/crash.

Responder2

(Movendo uma resposta de OP na pergunta para uma resposta)

Marquei a resposta abaixo como correta, pois me ajudou a identificar o que realmente estava errado, e gostaria de voltar no futuro para esclarecer isso um pouco mais, mas minha solução atual (que suspeito que funcionaria na maioria Máquinas Linux) é usar os seguintes comandos-

cat /proc/sys/kernel/core_pattern > ~/.core_pattern.bak 
echo '|/usr/bin/tee ~/path_you_wish_to_dump_to/core/dump' | sudo tee /proc/sys/kernel/core_pattern

Isso fará o backup do seu método de core dump anterior em um arquivo oculto ( .core_pattern.bak) na sua pasta pessoal que pode ser restaurado com

sudo cp ~/.core_pattern.bak /proc/sys/kernel/core_pattern

e o segundo comando fará com que os core dumps sejam despejados em uma pasta chamada corearquivo chamado dump. Obviamente você pode mexer nesse formato para conseguir um padrão mais do seu agrado. Deve-se notar, no entanto, que até onde eu sei, isso armazenará apenas um core dump por vez (cada novo irá superar os antigos), mas como, se eu pessoalmente verificar um core dump, é para o programa que acabou de ser executado e como não preciso manter dumps antigos, esta é uma boa solução para mim e para a maioria dos aplicativos que meus amigos criarão e depurarão. Eu adoraria modificar esta resposta um pouco mais adiante para incluir coisas como o PID que causou o segfault (principalmente apenas açúcar por cima, já que -de novo -eu normalmente sei qual programa causou o segfault, já que acabei de executá-lo), mas isso certamente será suficiente para mim e para muitas pessoas, imagino.

Por último, mas não menos importante, para visualizar o dump, basta executar o comando:

gdb ./executable_that_crashed ~/path_you_wish_to_dump_to/core/dump

Supondo que você esteja na pasta onde compilou/executou o executável que está obtendo o segfault.

informação relacionada