Während eines C-Programms wird "(Core Dumped)" angezeigt, aber unter dem aktuellen Pfad werden keine Dateien angezeigt.
Ich habe Folgendes festgelegt und überprüft ulimit
:
ulimit -c unlimited
ulimit -a
Ich habe auch versucht, eine Datei mit dem Namen "core" zu finden, aber die Core-Dump-Datei nicht erhalten?
Hilfe, wo ist meine Kerndatei?
/proc/sys/kernel/core_pattern
mit einer Zeichenfolge überschreiben, die mit beginnt/tmp
, werden Ihre Core-Dumps dort abgelegt.Antworten:
Lesen Sie /usr/src/linux/Documentation/sysctl/kernel.txt .
Anstatt den Core-Dump auf die Festplatte zu schreiben, ist Ihr System so konfiguriert, dass er ihn
abrt
stattdessen an das Programm sendet . Das Automated Bug Reporting Tool ist möglicherweise nicht so dokumentiert, wie es sein sollte ...In jedem Fall lautet die schnelle Antwort, dass Sie in der Lage sein sollten, Ihre Kerndatei zu finden
/var/cache/abrt
, in derabrt
sie nach dem Aufruf gespeichert wird. In ähnlicher Weise können andere Systeme, die Apport verwenden, Kerne entfernen/var/crash
und so weiter.quelle
/var/spool/abrt/
statt/var/cache/abrt
/var/lib/systemd/coredump/
Unter Ubuntu (in meinem Fall 12.04) ist es möglich, dass "Segmentierungsfehler (Core Dumped)" gedruckt wird, aber keine Core-Datei erstellt wird, wo Sie eine erwarten könnten (zum Beispiel für ein lokal kompiliertes Programm).
Dies kann passieren, wenn Sie eine Kerndateigröße von 0 haben (Sie haben es noch nicht getan
ulimit -c unlimited
) - dies ist die Standardeinstellung unter Ubuntu. Normalerweise würde dies das "(Core Dumped)" unterdrücken und Sie auf Ihren Fehler hinweisen, aber unter Ubuntu werden Corefiles über an Apport (Ubuntus Crash Reporting System) weitergeleitet/proc/sys/kernel/core_pattern
, und dies scheint die irreführende Meldung zu verursachen.Wenn Apport feststellt, dass es sich bei dem fraglichen Programm nicht um ein Programm handelt, für das Abstürze gemeldet werden sollen (was Sie sehen können
/var/log/apport.log
), wird das Standard-Kernelverhalten beim Einfügen einer Kerndatei in das cwd simuliert (dies erfolgt im Skript)/usr/share/apport/apport
). Dies beinhaltet die Ehrung von ulimit. In diesem Fall wird nichts unternommen. Aber (ich nehme an) was den Kernel betrifft, wurde eine Corefile generiert (und an Apport weitergeleitet), daher die Meldung "Segmentierungsfehler (Core Dumped)".Letztendlich PEBKAC, weil ich vergessen hatte, ulimit zu setzen, aber die irreführende Nachricht ließ mich denken, dass ich für eine Weile verrückt wurde und mich fragte, was meine Corefiles fraß.
(Im Allgemeinen ist die Handbuchseite zum Kern (5) -
man 5 core
- eine gute Referenz dafür, wo Ihre Kerndatei landet und warum sie möglicherweise nicht geschrieben wurde.)quelle
sudo service apport stop
indem Sie/proc/sys/kernel/core_pattern
Folgendes ausführen: Nachdem ich das ausgeführt habe, wurde es von der Apport-Pipe auf "Just" geändertcore
. Apport ist klug genug, um dascore_pattern
vorübergehend zu beheben , nehme ich an.Mit dem Start von systemd gibt es noch ein anderes Szenario. Standardmäßig speichert systemd Core-Dumps in seinem Journal, auf die mit dem
systemd-coredumpctl
Befehl zugegriffen werden kann . In der core_pattern-Datei definiert:Dieses Verhalten kann mit einem einfachen "Hack" deaktiviert werden:
Wie immer muss die Größe der Core-Dumps gleich oder höher sein als die Größe des Core-Dumps, wie dies beispielsweise der Fall ist
ulimit -c unlimited
.quelle
ulimit -c unlimited
.50-coredump.conf
stattcoredump.conf
. Dies sollte überschreiben/lib/sysctl.d/50-coredump.conf
. Die Standardeinstellung kann mitsysctl -w kernel.core_pattern=core
sudo service apport stop
Schreiben von Anweisungen zum Abrufen eines Core-Dumps unter Ubuntu 16.04 LTS :
Wie @jtn in seiner Antwort erwähnt hat, delegiert Ubuntu die Anzeige von Abstürzen an apport , was wiederum das Schreiben des Speicherauszugs verweigert, da das Programm kein installiertes Paket ist.
Um das Problem zu beheben, müssen wir sicherstellen, dass Apport auch Core-Dump-Dateien für Nicht-Paket- Programme schreibt . Erstellen Sie dazu eine Datei mit dem Namen ~ / .config / apport / settings mit folgendem Inhalt:
[main] unpackaged=true
[Optional] Führen Sie den folgenden Befehl aus, um die Speicherauszüge von gdb lesbar zu machen:
apport-unpack <location_of_report> <target_directory>
Referenzen: Core_dump - Oracle VM VirtualBox
quelle
Ich könnte mir zwei Möglichkeiten vorstellen:
Wie andere bereits betont haben, könnte das Programm
chdir()
. Darf der Benutzer, der das Programm ausführt, in das Verzeichnis schreiben, in das es geschrieben wurdechdir()
? Wenn nicht, kann der Core Dump nicht erstellt werden.Aus irgendeinem seltsamen Grund wird der Core Dump nicht benannt
core.*
Sie können dies überprüfen/proc/sys/kernel/core_pattern
. Außerdem würde der von Ihnen benannte Befehl find keinen typischen Core-Dump finden. Sie sollten verwendenfind / -name "*core.*"
, wie der typische Name des Coredump istcore.$PID
quelle
Wenn Sie Core-Dumps für Binärdateien auf
RHEL
und bei der Verwendung vermissenabrt
, stellen Sie dies sicher/etc/abrt/abrt-action-save-package-data.conf
enthält
Dies ermöglicht die Erstellung von Absturzberichten (einschließlich Core-Dumps) für Binärdateien, die nicht Teil installierter Pakete sind (z. B. lokal erstellt).
quelle
Für fedora25 konnte ich die Kerndatei unter finden
wo
ccpp-2017-02-16-16:36:51-2974" is pattern "%s %c %p %u %g %t %P %
gemäß `/ proc / sys / kernel / core_pattern 'quelle
Meine Bemühungen in der WSL waren erfolglos.
Für diejenigen, die unter Windows Subsystem für Linux (WSL) ausgeführt werden, scheint derzeit ein offenes Problem für fehlende Core-Dump-Dateien zu bestehen.
Die Kommentare zeigen das an
Github-Problem
Windows-Entwickler-Feedback
quelle
In Ubuntu18.04 ist es am einfachsten, eine Kerndatei abzurufen, indem Sie den folgenden Befehl eingeben, um den Apportierungsdienst zu beenden.
Führen Sie dann die Anwendung erneut aus. Sie erhalten eine Dump-Datei im aktuellen Verzeichnis.
quelle
Ich bin auf Linux Mint 19 (Ubuntu 18 basiert). Ich wollte
coredump
Dateien im aktuellen Ordner haben. Ich musste zwei Dinge tun:/proc/sys/kernel/core_pattern
(nach# echo "core.%p.%s.%c.%d.%P > /proc/sys/kernel/core_pattern
oder nach# sysctl -w kernel.core_pattern=core.%p.%s.%c.%d.%P)
$ ulimit -c unlimited
Das wurde bereits in den Antworten geschrieben, aber ich schrieb, um es kurz zusammenzufassen. Interessanterweise erforderte das Ändern des Limits keine Root-Berechtigungen (gemäß /ubuntu/162229/how-do-i-increase-the-open-files-limit-for-a-non-root-user non- root kann nur das Limit senken, was unerwartet war - Kommentare dazu sind willkommen).
quelle
ulimit -c unlimited
Die Kerndatei wurde nach einem "Core Dump" korrekt im aktuellen Verzeichnis angezeigt.quelle