So zeigen Sie die Core-Datei an (allgemein)

So zeigen Sie die Core-Datei an (allgemein)

Szenario (Ubuntu 16.04):

Ich kompiliere und führe ein C-Programm aus (mit ) -g, erhalte das traditionelle Segmentation Fault (core dumped), und dann ist (natürlich) keine mythische „Core“-Datei zu finden. Nach einiger Recherche soll ich es /proc/sys/kernel/core_patternmit einem Befehl wie folgt ändern: echo '|tee /home/me/my_core_folder/my_core_file' | sudo tee /proc/sys/kernel/core_pattern, und nachdem ich das getan habe, erhalte ich kein einziges mehr, (core dumped)sondern nur noch das einfache Segmentation Fault. Ich probiere Dinge aus wie gdb ./program_object_file.out core.pid, das es offensichtlich nicht gibt (ich war langsam verzweifelt), und natürlich probiere ich das einfache, gdb ./a.outgefolgt von (gdb) core core.pidund Varianten der Befehle, bei denen ich tabverzweifelt die Taste spamme und versuche, die Autovervollständigung zu erhalten, die mich dahin bringt, wo ich hin muss.

Frage:

Gibt es eine allgemeine Möglichkeit, Core Dumps zu erhalten? Ich erkenne, dass jede Maschine, die ich berühre, einenTransformers von Michael Bay-ähnliche Fähigkeit, Hardware und Software so neu zu konfigurieren, dass kein Gerät, das ich besitze, sofort normal funktionieren wird. Gibt es einen einfachen Algorithmus/ein einfaches Rezept, dem ich folgen kann, um Core Dumps auf meinem eigenen Rechner und auf den Rechnern anderer Leute zu finden? Ich ertappe mich immer dabei, wie ich Freunden Nachhilfe in solchen Sachen gebe, nachdem ich nicht wenig Arbeit investiert habe, um die Dinge für mich selbst zum Laufen zu bringen, und es wäre schön, einen Befehl oder etwas Ähnliches ausführen zu können, um Core-Dateien in das Verzeichnis zu übertragen, aus dem die ausführbare Datei ausgeführt wurde ... gibt es eine Möglichkeit, dies zu tun, die auf den meisten (ich würde mich mit „einigen“ zufrieden geben) Linux/Unix-Rechnern funktionieren sollte?

Antwort1

Dercore(5)Die Manpage beschreibt die Parameter, die sich auf Core Dumps auswirken, im Detail, einschließlich ihrer Benennung usw.

Um Ihre Frage zu beantworten: Es gibt keine allgemeingültige Methode, einen Core Dump zu finden. Standardmäßig wird der Core Dump inVerfahrenaktuelles Arbeitsverzeichnis, ob der Prozess dort schreiben darf, ob auf dem enthaltenen Dateisystem genügend Platz vorhanden ist, ob kein vorhandener Core Dump vorhanden ist (unter bestimmten Umständen) und ob die Dateigröße und die Core-Dateigrößenbeschränkungen (festgelegt durch ulimitoder ähnliche Mechanismen) dies zulassen. /proc/sys/kernel/core_patternBietet jedoch viele verschiedene Möglichkeiten zur Verarbeitung von Core Dumps, sodass Sie sich das auch unbedingt ansehen und herausfinden müssen, was los ist.

In Ihrem Fall weiß ich nicht, warum der Kern zunächst nicht gefunden werden konnte, aber ich weiß, warum Sie nach dem Einrichten der Umleitung keine Kerne mehr erhalten haben: Bei Verwendung einer Pipe in hat core_patterndas Verarbeitungsprogrammmussmuss mit einem absoluten Pfadnamen angegeben werden. wird teeallein nicht verwendet; Sie müssen angeben /usr/bin/tee. Beachten Sie, dass Sie bei dieser Art der Einrichtung auf Mehrbenutzersystemen besonders vorsichtig sein sollten, da das Programm zum Verarbeiten des Core Dumps als ausgeführt wird root.

Auf Debian-Derivaten installiere ichcorekeeper, das Core-Dumps auf benutzerfreundliche Weise in benutzerspezifische Verzeichnisse unter schreibt /var/crash.

Antwort2

(Verschieben einer Antwort vom OP in der Frage in eine Antwort)

Ich habe die folgende Antwort als korrekt markiert, da sie mir geholfen hat, herauszufinden, was tatsächlich schief lief. Ich würde in Zukunft gerne noch einmal darauf zurückkommen, um das Ganze etwas genauer zu beschreiben. Meine aktuelle Lösung (von der ich annehme, dass sie auf den meisten Linux-Rechnern funktionieren würde) besteht jedoch darin, die folgenden Befehle zu verwenden:

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

Dadurch wird Ihre bisherige Methode zum Core Dumping in eine versteckte Datei ( ) in Ihrem Home-Ordner gesichert. .core_pattern.bakDiese kann wiederhergestellt werden mit

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

und der zweite Befehl bewirkt, dass Core Dumps in einen Ordner coremit dem Namen einer Datei namens dump. Natürlich können Sie mit diesem Format herumspielen, um ein Muster zu erhalten, das Ihnen besser gefällt. Es sollte jedoch beachtet werden, dass, soweit ich das beurteilen kann, nur ein Core Dump gleichzeitig gespeichert wird (jeder neue überschreibt die alten), aber da ich persönlich, wenn ich jemals einen Core Dump überprüfe, dies für das Programm ist, das gerade ausgeführt wurde, und da ich keine alten Dumps aufbewahren muss, ist dies eine gute Lösung für mich und für die meisten Anwendungen, die meine Freunde erstellen und debuggen werden. Ich würde diese Antwort später gerne noch etwas modifizieren, um Dinge wie die PID einzuschließen, die den Segmentierungsfehler verursacht hat (meistens nur Zuckerguss obendrauf, da ich – noch einmal – normalerweise weiß, welches Programm den Segmentierungsfehler verursacht hat, da ich es gerade ausgeführt habe), aber dies wird sicherlich für mich und für viele Leute ausreichen, würde ich mir vorstellen.

Und zu guter Letzt: Um den Dump tatsächlich anzuzeigen, führen Sie einfach den folgenden Befehl aus:

gdb ./executable_that_crashed ~/path_you_wish_to_dump_to/core/dump

Angenommen, Sie befinden sich in dem Ordner, in dem Sie die ausführbare Datei kompiliert/ausgeführt haben, bei der der Segmentierungsfehler auftritt.

verwandte Informationen