Core scaricato, ma il file core non si trova nella directory corrente?


277

Durante l'esecuzione di un programma C, dice "(core dumped)" ma non riesco a vedere alcun file nel percorso corrente.

Ho impostato e verificato il ulimit:

ulimit -c unlimited 
ulimit -a 

Ho anche provato a trovare un file chiamato "core", ma non hai ottenuto il file di core dump?
Qualche aiuto, dov'è il mio file principale?


1
Il programma invoca chdir ad un certo punto? Se è così, guarda lì.
William Pursell,

2
Il programma cambia la sua directory di lavoro? Guarda qui.
Richard Pennington,

Vorrei cercare l'intero disco rigido per un file recente;)
Hamish Grubijan,

1
oops no non c'è ... l'ho controllato .. programma chdir in / mnt e / ho controllato entrambe le directory ma non sono riuscito a trovare il file. Ho persino trovato / -name "* core". anche questo non mi ha mostrato il file. Il programma utilizza C + sqlite, mentre inserisce i valori nelle core dump Ha detto errore di asserzione == 0 per la prima volta ed errore = 101 per la seconda volta ..
webminal.org

8
Sì, se si esegue l'override /proc/sys/kernel/core_patterncon una stringa che inizia con /tmpallora è lì che andranno i dump del core.
effimero

Risposte:


240

Leggi /usr/src/linux/Documentation/sysctl/kernel.txt .

[/ proc / sys / kernel /] core_pattern viene utilizzato per specificare un nome di modello di file di dump principale.

  • Se il primo carattere del pattern è un '|', il kernel tratterà il resto del pattern come un comando da eseguire. Il dump principale verrà scritto nell'input standard di quel programma anziché in un file.

Invece di scrivere il dump principale su disco, il sistema è configurato per inviarlo al abrtprogramma. Lo strumento di segnalazione automatica dei bug non è probabilmente documentato come dovrebbe essere ...

In ogni caso, la risposta rapida è che dovresti essere in grado di trovare il tuo file principale /var/cache/abrt, dove lo abrtmemorizza dopo essere stato invocato. Allo stesso modo, altri sistemi che utilizzano Apport possono eliminare i core /var/crashe così via.


30
sì, ho modificato core_pattern con il seguente contenuto echo "core.% e.% p"> / proc / sys / kernel / core_pattern .. ora crea il file core dump nella stessa directory corrente. con il nome "core.giis.12344" ecc. Grazie a tutti per le risposte / commenti / suggerimenti.
webminal.org il

20
Solo per notare che il programma 18 di Fedora sta memorizzando core dump /var/spool/abrt/invece di/var/cache/abrt
Nelson

4
C'è un modo per consentire agli utenti di configurarlo da soli, piuttosto che chiunque debba usare la configurazione del sistema?
codice alleato

Quando questo comando viene eseguito e il processo viene invocato, stdout e stderr non vengono aperti per impostazione predefinita? Vedo accadere cose molto strane. quando uso dup2 di stderr e stdout nel mio file personalizzato (applog.txt), i dati che sto scrivendo in un altro file (mycore.BIN) vengono reindirizzati al file che ho usato per catturare stdout e stderr (applog.txt) . C'è una buona lettura su questo? Per favore, suggerisci Grazie
mk ..

20
systemd in archlinux store coredumps in/var/lib/systemd/coredump/
Francois,

224

Su Ubuntu recente (12.04 nel mio caso), è possibile stampare "Errore di segmentazione (core dumped)", ma non viene prodotto alcun file core dove ci si potrebbe aspettare uno (ad esempio per un programma compilato localmente).

Questo può accadere se hai un ulimit di dimensione del file core pari a 0 (non lo hai fatto ulimit -c unlimited) - questo è il valore predefinito su Ubuntu. Normalmente ciò sopprimerebbe il "(core dumped)", inducendoti nel tuo errore, ma su Ubuntu, i corefile vengono inviati ad Apport (il sistema di segnalazione degli arresti anomali di Ubuntu) tramite /proc/sys/kernel/core_pattern, e questo sembra causare il messaggio fuorviante.

Se Apport scopre che il programma in questione non è quello per cui dovrebbe riportare arresti anomali (di cui puoi vedere che sta succedendo /var/log/apport.log), ricade nella simulazione del comportamento predefinito del kernel di mettere un file core nel CWD (questo viene fatto nello script /usr/share/apport/apport). Questo include onorare ulimit, nel qual caso non fa nulla. Ma (suppongo) per quanto riguarda il kernel, è stato generato un file core (e inviato ad apportato), da cui il messaggio "Errore di segmentazione (core scaricato)".

Alla fine PEBKAC per aver dimenticato di impostare ulimit, ma il messaggio fuorviante mi fece pensare che stavo diventando pazzo per un po ', chiedendomi cosa stesse mangiando i miei corefile.

(Inoltre, in generale, la pagina del manuale core (5) - man 5 core- è un buon riferimento per dove finisce il tuo file core e per quali motivi potrebbe non essere scritto.)


4
Grazie mille - ho riscontrato lo stesso problema. A proposito, Ubuntu 14.04 mostra esattamente lo stesso comportamento di quello che hai descritto.
Malte Skoruppa,

5
Sulla mia installazione di Ubuntu (modificata 14.04), c'è una semplice soluzione temporanea per questo eseguendo sudo service apport stop--- dopo che l'ho eseguito, è passato /proc/sys/kernel/core_patternda apport pipe a solo core. core_patternSuppongo che Apport sia abbastanza intelligente da sistemare temporaneamente.
Patrick Collins,

6
"ulimit -c unlimited" è esattamente ciò di cui avevo bisogno - Grazie!
Dave C,

4
Ho provato ogni risposta applicabile e ogni posizione in ogni commento qui dopo aver eseguito il comando ulimit, ma ancora non riesco a trovare un file core da nessuna parte sul mio Ubuntu 16.04 LTS ...
Nagev

2
@ElectricGoat No, non l'ho fatto. È un design UX scadente, IMO. Il sistema dovrebbe semplicemente stampare il percorso o non stampare affatto un messaggio se non viene creato. Aggiungerò la mia risposta, quando o se avrò la possibilità di indagare ulteriormente.
Nagev,

80

Con il lancio di systemd , c'è anche un altro scenario. Di default systemd memorizzerà i dump principali nel suo journal, essendo accessibile con il systemd-coredumpctlcomando. Definito nel file core_pattern:

$ cat /proc/sys/kernel/core_pattern 
|/usr/lib/systemd/systemd-coredump %p %u %g %s %t %e

Questo comportamento può essere disabilitato con un semplice "hack":

$ ln -s /dev/null /etc/sysctl.d/50-coredump.conf
$ sysctl -w kernel.core_pattern=core      # or just reboot

Come sempre, la dimensione dei core dump deve essere uguale o superiore alla dimensione del core che viene scaricato, come fatto per esempio ulimit -c unlimited.


Quel "hack" non ha funzionato per me (anche dopo un riavvio). Sto eseguendo Arch Linux e ho già eseguito ulimit -c unlimited.
gsingh2011,

@ gsingh2011 Potrebbe non essere aggiornato. Non eseguo più Arch, quindi non posso dire se dovrebbe funzionare in questi giorni. Se lo capisci sentiti libero di aggiornarmi con un nuovo commento.
timss

5
@ gsingh2011 Prova 50-coredump.confinvece di coredump.conf. Questo dovrebbe prevalere /lib/sysctl.d/50-coredump.conf. L'impostazione predefinita può essere ripristinata consysctl -w kernel.core_pattern=core
Lekensteyn il

Ho dovuto disattivare l'appport perché funzionassesudo service apport stop
rahul003,

51

Scrivere istruzioni per ottenere un dump di base in Ubuntu 16.04 LTS :

  1. Come ha detto @jtn nella sua risposta, Ubuntu delega la visualizzazione degli arresti anomali a apport , che a sua volta rifiuta di scrivere il dump perché il programma non è un pacchetto installato.Prima di apportare modifiche

  2. Per risolvere il problema, dobbiamo assicurarci che apport scriva i file core di dump anche per i programmi non pacchetto . Per fare ciò, crea un file chiamato ~ / .config / apport / settings con i seguenti contenuti:
    [main] unpackaged=true

  3. Ora blocca di nuovo il programma e vedi i tuoi file di crash generati nella cartella: / var / crash con nomi come * .1000.crash . Nota che questi file non possono essere letti direttamente da gdb .Dopo aver apportato modifiche
  4. [Opzionale] Per rendere leggibili i dump da gdb, eseguire il comando seguente:

    apport-unpack <location_of_report> <target_directory>

Riferimenti: Core_dump - Oracle VM VirtualBox


3
Questa è l'unica soluzione che ha funzionato per me in Ubuntu 18.04
greuze il

A quale utente appartiene ~ /? Se il processo è eseguito da root significa /root/.config/apport/settings?
Nicholi,

@Nicholi Credo che dovrebbe essere l'utente che ha eseguito il programma. Non sono sicuro però.
ankurrc,

12

Potrei pensare a due seguenti possibilità:

  1. Come altri hanno già sottolineato, il programma potrebbe chdir(). L'utente che esegue il programma è autorizzato a scrivere nella directory in cui è stato chdir()editato? In caso contrario, non è possibile creare il dump principale.

  2. Per qualche strana ragione il dump principale non ha un nome core.*Puoi verificarlo /proc/sys/kernel/core_pattern. Inoltre, il comando find che hai nominato non trova un tipico dump del core. Dovresti usare find / -name "*core.*", come è il nome tipico del coredumpcore.$PID


ecco il mio modello: questo significa che il file core è chiamato "PID.signal.userid" invece di core.pid ??? $ cat / proc / sys / kernel / core_pattern / usr / lib / hookCCpp / var / char / abrt% p% s% u
webminal.org

9

Se ti mancano i core dump per i binari su RHELe durante l'utilizzo abrt, assicurati/etc/abrt/abrt-action-save-package-data.conf

contiene

ProcessUnpackaged = yes

Ciò consente la creazione di rapporti sugli arresti anomali (inclusi core dump) per i file binari che non fanno parte dei pacchetti installati (ad esempio, creati localmente).


6

Per fedora25, ho trovato il file core su

/var/spool/abrt/ccpp-2017-02-16-16:36:51-2974/coredump

dove ccpp-2017-02-16-16:36:51-2974" is pattern "%s %c %p %u %g %t %P %secondo `/ proc / sys / kernel / core_pattern '



5

In Ubuntu18.04, il modo più semplice per ottenere un file core è inserire il comando seguente per interrompere il servizio apport.

sudo service apport stop

Quindi riesegui l'applicazione, otterrai il file di dump nella directory corrente.


3

Sono su Linux Mint 19 (basato su Ubuntu 18). Volevo avere coredumpfile nella cartella corrente. Ho dovuto fare due cose:

  1. Cambia /proc/sys/kernel/core_pattern(di # echo "core.%p.%s.%c.%d.%P > /proc/sys/kernel/core_patterno di# sysctl -w kernel.core_pattern=core.%p.%s.%c.%d.%P)
  2. Aumentare il limite per la dimensione del file core di $ ulimit -c unlimited

Questo è stato già scritto nelle risposte, ma ho scritto per riassumere brevemente. Il limite che cambia in modo interessante non richiede privilegi di root (come da /ubuntu/162229/how-do-i-increase-the-open-files-limit-for-a-non-root-user non- root può solo abbassare il limite, quindi era inaspettato - i commenti sono ben accetti).


2

ulimit -c unlimited fatto apparire correttamente il file core nella directory corrente dopo un "core dump".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.