2009-04-22 8 views
9

Manchmal, wenn ich meinen Code ausführen, wird eine Core-Dump-Datei generiert, wenn ich das Programm durch Ctrl + \ beenden. Der Dateiname hat das Format core.*. Das Programm wird nicht abrupt beendet, und es gibt keinen Segmentierungsfehler. Ich glaube es ist SIGQUIT und nicht SIGABRT oder SIGSEGV. Wenn ich versuche, Ctrl +C oder Ctrl +Z, dann wird es nicht erzeugt.Warum werden Core-Dump-Dateien generiert?

Kann mir jemand sagen, warum es nur dann erzeugt wird, wenn Ctrl +\ gedrückt wird? Wie kann ich vermeiden, dass diese Core-Dump-Datei generiert wird? Gibt es irgendeine Verwendung für die Core Dumped-Datei?

+0

Wenn Sie sagen "run my code", sprechen Sie über, wann Sie laufen machen? Oder wenn Sie die kompilierte Binärdatei ausführen? – harto

Antwort

17

Ein Prozess löscht den Kern, wenn er aufgrund eines Fehlers im Programm vom Betriebssystem beendet wird. Der häufigste Grund dafür ist, dass das Programm auf einen ungültigen Zeigerwert zugegriffen hat. Da es sich um einen sporadischen Speicherauszug handelt, verwenden Sie wahrscheinlich einen nicht initialisierten Zeiger.

Können Sie den Code posten, der den Fehler verursacht? Abgesehen von vagen Verallgemeinerungen ist es schwer zu erraten, was falsch ist, ohne Code tatsächlich zu sehen.

Als für das, was ein Core-Dump tatsächlich ist, lesen Sie in diesem Wikipedia-Artikel:

+5

In Linux verursacht Strg + \ einen Core-Dump, auch wenn das Programm keine Fehler hat und zum Zeitpunkt der Beendigung gut läuft. – ely

5

Es ist ein Werkzeug in Debuggen einer Anwendung zu unterstützen, die schlecht zu verhalten hat. Es ist groß, weil es den Inhalt aller physischen Anwendungen zum Zeitpunkt des Absturzes sowie die Registerzustände und Stacks aller Threads enthält.

Sie werden generiert, wenn der Kernel eine Anwendung zum Ausführen von etwas Bösem, wie das Generieren einer Segmentierungsverletzung oder eines Busfehlers, beendet.

+0

Hum ... Es enthält nur einen Speicherauszug des Prozessusspeichers, aber trotzdem kann es ziemlich viel Speicher sein. – Ben

7

Core-Dumps werden generiert, wenn der Prozess bestimmte Signale empfängt, z. B. SIGSEGV, die der Kernel sendet, wenn er auf Speicher außerhalb seines Adressraums zugreift. In der Regel geschieht dies aufgrund von Fehlern bei der Verwendung von Zeigern. Das heißt, es gibt einen Fehler im Programm.

Der Core-Dump ist nützlich, um den Fehler zu finden. Es ist ein Abbild des Arbeitsspeichers des Prozesses zum Zeitpunkt des Problems, so dass ein Debugger wie gdb verwendet werden kann, um zu sehen, was das Programm dann tat. Der Debugger kann sogar (manchmal) auf die Werte von Variablen im Programm zugreifen.

Mit dem Befehl ulimit können Sie Core-Dumps verhindern.

10

Wie bereits von anderen erwähnt, ist der Core Dump das Ergebnis eines Fehlers im Programm.

Sie können konfigurieren, ob ein Core Dump mit dem Befehl ulimit generiert werden soll. Eingabe

ulimit -c 0 

deaktiviert die Kerndateigenerierung in der aktiven Shell.

Wenn das Programm, das den Kern erzeugt mit Symbolinformationen gebaut wurde und Sie können post mortem debugging session wie folgt tun:

gdb <pathto/executable> --core <corefilename> 
2

Sie vermeiden können, eine Core-Dump-Datei zu erstellen, indem das Schreiben von Code, der nicht abstürzt :)

Im Ernst, Core Dumps sind nützlich, weil Sie den Status des Programms sehen können, wenn es abgestürzt ist, für "Post Mortem" Debugging. Sie können sie in gdb öffnen und den Status Ihres Programms überprüfen (besonders wenn es mit Debugging erstellt wurde).

Core Dumps werden normalerweise gemacht, wenn das Programm einen SIGSEGV hat (normalerweise verursacht durch ungültige Zeigerdereferenzierung), SIGABRT (was passieren würde, wenn Sie abort() aufrufen würden, oder in C++ vom Standardhandler für Ausnahmen in Destruktoren) usw.) oder ein anderer Fehler. Sie können sie auch explizit mit dem Debugger oder programmgesteuert auslösen.

Wenn Sie alle Fehler behoben haben und es perfekt ist, können Sie sie löschen. Auch wenn Sie Ihr Programm in irgendeiner Weise geändert haben (und es neu kompiliert haben), werden sie nutzlos, da die Debug-Informationen jetzt nicht mit denen im Core-Dump übereinstimmen, also können Sie sie auch löschen.

6

ctrl + \ sendet Signal SIGQUIT an den Prozess. Gemäß dem POSIX.1-Standard besteht die Standardaktion für dieses Signal darin, einen Kern zu generieren.

SIGILL, SIGABRT, SIGFPE, SIGSEGV sind andere Fälle, wenn System einen Kern erzeugen wird.

Bitte beachten Sie "Mann 7 Signal" auf Ihrem System für weitere Details.

1

Der Punkt der Ctrl + \ ist eine Coredump zu erzeugen. Das macht SIGQUIT. Wenn Sie nicht möchten, dass es generiert wird, verwenden Sie stattdessen Ctrl + C (SIGINT). Wenn das betreffende Programm nicht auf SIGINT reagiert, Sie es aber vom Terminal aus beenden müssen, machen Sie oder der Entwickler etwas falsch.

Programme nicht vom Terminal mit Ctrl +C getötet werden noch anmutig zu SIGTERM reagieren soll, die in einem anderen Endgerät über kill -TERM ... ausgelöst werden können. Wenn alles andere fehlschlägt, wird SIGKILL eine sofortige Beendigung erzwingen.