Durante a execução de um programa C, ele diz "(core dumped)", mas não consigo ver nenhum arquivo no caminho atual.
Eu configurei e verifiquei o ulimit
:
ulimit -c unlimited
ulimit -a
Eu também tentei encontrar um arquivo chamado "core", mas não recebi o arquivo despejado do núcleo?
Qualquer ajuda, onde está o meu arquivo principal?
/proc/sys/kernel/core_pattern
por uma sequência iniciada por/tmp
, é para onde os seus despejos principais irão.Respostas:
Leia /usr/src/linux/Documentation/sysctl/kernel.txt .
Em vez de gravar o dump principal em disco, seu sistema está configurado para enviá-lo ao
abrt
programa. A Ferramenta Automatizada de Relatório de Erros possivelmente não está tão documentada quanto deveria ...De qualquer forma, a resposta rápida é que você poderá encontrar seu arquivo principal
/var/cache/abrt
, onde oabrt
armazena após ser chamado. Da mesma forma, outros sistemas que usam o Apport podem desviar os núcleos/var/crash
e assim por diante.fonte
/var/spool/abrt/
vez de/var/cache/abrt
/var/lib/systemd/coredump/
No Ubuntu recente (12.04 no meu caso), é possível que "Falha de segmentação (core despejado)" seja impressa, mas nenhum arquivo principal foi produzido onde você poderia esperar um (por exemplo, para um programa compilado localmente).
Isso pode acontecer se você tiver um ulimit de tamanho de arquivo principal igual a 0 (ainda não o fez
ulimit -c unlimited
) - esse é o padrão no Ubuntu. Normalmente, isso suprimiria o "(núcleo despejado)", enganando você, mas no Ubuntu, os corefiles são canalizados para o Apport (sistema de relatório de falhas do Ubuntu) via/proc/sys/kernel/core_pattern
, e isso parece causar a mensagem enganosa.Se o Apport descobrir que o programa em questão não é um para o qual deveria estar relatando falhas (o que você pode ver acontecendo
/var/log/apport.log
), ele volta a simular o comportamento padrão do kernel de colocar um arquivo principal no cwd (isso é feito no script/usr/share/apport/apport
) Isso inclui honrar o ulimit, caso em que não faz nada. Mas (eu assumo) no que diz respeito ao kernel, um corefile foi gerado (e canalizado para apport), daí a mensagem "Falha na segmentação (core despejado)".Por fim, PEBKAC por esquecer de definir ulimit, mas a mensagem enganosa me fez pensar que eu estava ficando louco por um tempo, imaginando o que estava comendo meus arquivos principais.
(Além disso, em geral, a página de manual do núcleo (5) -
man 5 core
- é uma boa referência para onde seu arquivo principal termina e os motivos pelos quais ele pode não ser gravado.)fonte
sudo service apport stop
--- depois que eu executei, ele mudou/proc/sys/kernel/core_pattern
do apport pipe para apenascore
. O Apport é inteligente o suficiente para consertarcore_pattern
temporariamente, suponho.Com o lançamento do systemd , há outro cenário também. Por padrão, o systemd armazenará os dumps principais em seu diário, sendo acessível com o
systemd-coredumpctl
comando Definido no arquivo core_pattern:Esse comportamento pode ser desabilitado com um simples "hack":
Como sempre, o tamanho dos dumps do núcleo deve ser igual ou superior ao tamanho do núcleo que está sendo despejado, como feito por exemplo
ulimit -c unlimited
.fonte
ulimit -c unlimited
.50-coredump.conf
vez decoredump.conf
. Isso deve substituir/lib/sysctl.d/50-coredump.conf
. O padrão pode ser restaurado comsysctl -w kernel.core_pattern=core
sudo service apport stop
Escrevendo instruções para obter um dump principal no Ubuntu 16.04 LTS :
Como o @jtn mencionou em sua resposta, o Ubuntu delega a exibição de falhas para apport , que por sua vez se recusa a escrever o dump porque o programa não é um pacote instalado.
Para solucionar o problema, precisamos garantir que o apport grave também os arquivos de despejo principal para programas que não sejam de pacote . Para fazer isso, crie um arquivo chamado ~ / .config / apport / settings com o seguinte conteúdo:
[main] unpackaged=true
[Opcional] Para tornar os dumps legíveis pelo gdb, execute o seguinte comando:
apport-unpack <location_of_report> <target_directory>
Referências: Core_dump - Oracle VM VirtualBox
fonte
Eu poderia pensar em duas seguintes possibilidades:
Como outros já apontaram, o programa pode
chdir()
. O usuário que está executando o programa pode gravar no diretório em quechdir()
está? Caso contrário, não poderá criar o dump principal.Por algum motivo estranho, o dump principal não é nomeado.
core.*
Você pode verificar/proc/sys/kernel/core_pattern
isso. Além disso, o comando find que você nomeou não encontrou um dump principal típico. Você deve usarfind / -name "*core.*"
, pois o nome típico do coredump écore.$PID
fonte
Se você estiver perdendo os core dumps para binários no
RHEL
e ao usarabrt
, verifique se/etc/abrt/abrt-action-save-package-data.conf
contém
Isso permite a criação de relatórios de falhas (incluindo dumps principais) para binários que não fazem parte dos pacotes instalados (por exemplo, compilados localmente).
fonte
Para o fedora25, eu poderia encontrar o arquivo principal em
onde
ccpp-2017-02-16-16:36:51-2974" is pattern "%s %c %p %u %g %t %P %
conforme `/ proc / sys / kernel / core_pattern 'fonte
Meus esforços na WSL foram infrutíferos.
Para aqueles executando o Windows Subsystem for Linux (WSL), parece haver um problema em aberto no momento para a falta de arquivos de despejo de núcleo.
Os comentários indicam que
Problema no Github
Comentários sobre o desenvolvedor do Windows
fonte
No Ubuntu18.04, a maneira mais fácil de obter um arquivo principal é inserir o comando abaixo para interromper o serviço apport.
Em seguida, execute novamente o aplicativo, você obterá o arquivo de despejo no diretório atual.
fonte
Estou no Linux Mint 19 (baseado no Ubuntu 18). Eu queria ter
coredump
arquivos na pasta atual. Eu tive que fazer duas coisas:/proc/sys/kernel/core_pattern
(por# echo "core.%p.%s.%c.%d.%P > /proc/sys/kernel/core_pattern
ou por# sysctl -w kernel.core_pattern=core.%p.%s.%c.%d.%P)
$ ulimit -c unlimited
Isso já foi escrito nas respostas, mas escrevi para resumir sucintamente. Curiosamente, o limite de alteração não exigia privilégios de root (como em /ubuntu/162229/how-do-i-increase-the-open-files-limit-for-a-nonnonroot-user non- root só pode diminuir o limite, o que foi inesperado - comentários sobre isso são bem-vindos).
fonte
ulimit -c unlimited
fez com que o arquivo principal apareça corretamente no diretório atual após um "núcleo despejado".fonte