Gibt es eine Möglichkeit zu wissen, wo Ihr Programm abbricht, wenn in Ihrem Programm ein Ungültigkeitsfehler (core dumped) auftritt, der das Unix-Terminal mit dem clang ++ Compiler verwendet?

Gibt es eine Möglichkeit zu wissen, wo Ihr Programm abbricht, wenn in Ihrem Programm ein Ungültigkeitsfehler (core dumped) auftritt, der das Unix-Terminal mit dem clang ++ Compiler verwendet?

Antonio Nesic, Senior Software Entwickler bei AVL

Nicht mit einem Compiler, aber es gibt nette Tools wie GDB (Debugger), Valgrind (statische Analysator) und xxd (Hex-Editor), die Ihnen helfen können, Ihren Fehler zu finden.

Aber auch ein guter Ausgangspunkt wäre Mallocs in C zu gucken.

Wir hatten ein ähnliches Problem, als wir Dateien bestimmter Größe erwarteten, aber nicht, dass wir irgendwann eine Datei haben werden, die größer als malloc ist.

Was ist passiert -> Segmentierungsfehler

Sobald Sie den Ort gefunden haben, können Sie ihn patchen.

Richard Conto, Programmierer in mehreren Sprachen. Debugger in noch mehr
Beantwortet 25. Januar 2018 · Autor hat 3.5k Antworten und 3m Antworten

Kompilieren Sie die Debugging-Metadaten, die aktiviert sind (in der Regel das Flag "-g" für C-Compiler - überprüfen Sie die Dokumentation zu Ihrem Compiler.)

Das wird "gdb" (oder andere Debugger wie "ups") mehr darüber verstehen lassen, was vor sich geht.

Aber du brauchst Folgendes:

Der Core-Dump (Linux-Systeme können so konfiguriert werden, dass sie Core-Dumps in abgelegene Bereiche stellen. Drat!)

Die ausführbare Datei, die dem Core-Dump entspricht

Der Quellcode, der mit der ausführbaren Datei übereinstimmt.

Wenn Sie die Bedingungen wiederholen können, die den Core-Dump verursacht haben, können Sie versuchen, das Programm unter dem Debugger auszuführen, bis es abstürzt und den Core-Dump nicht benötigt - aber das könnte auch einen anderen Fehler finden.

Beachten Sie, dass das Kompilieren mit aktivierten Debugging-Symbolen die Optimierung des Codes beeinflussen kann - und dies könnte sich auch ändern, wenn der Core-Dump auftritt.

Fred Mitchell, Ich kenne Ruby, Rust, Python, Haskell, C ++, Erlang und mehr.
Beantwortet 25. Januar 2018 · Autor hat 766 Antworten und 894k Antwortansichten

Machen Sie sich mit gdb vertraut. Stellen Sie sicher, dass der Code im Debug-Modus kompiliert wurde, damit er alle von gdb verwendeten Symboltabellenverweise enthält.

Wenn Sie Emacs verwenden, verfügt es über gdb-Funktionen, um das Festlegen von Haltepunkten in Ihrem Code mithilfe der Quelle als Referenz zu erleichtern.

Gdb ist dein Freund.

Iwan Pizjenko, Senior Software Engineer, über 15 Jahre Erfahrung in der Softwareentwicklung
Beantwortet 26. Januar 2018 · Autor hat 391 Antworten und 110.8k Antwortansichten

Ja, wenn es coredump erzeugt, können Sie es in einem Debugger wie gdb öffnen und einen Stack-Trace sehen. Wenn das Programm mit Debug-Informationen kompiliert wurde, sehen Sie auch Dateinamen und Zeilen von Quellcodes.

Travis Casey, MS in Comp Sci; Unix-Administrator; lehrte Betriebssysteme an der FSU
Beantwortet am 28. Januar 2018 · Autor hat 5k Antworten und 1,4m Antwortansichten

Wenn Sie nicht über einen Debugger oder ein anderes Hilfsprogramm verfügen, können Sie auf die ursprüngliche Methode zurückgreifen: Sie können eine Anweisung einfügen, die eine Nachricht wie "Zum Checkpoint 1 gemacht" an das Terminal sendet Setzen Sie dann Prüfpunkte ein, bis Sie den Punkt gefunden haben, an dem der Fehler auftritt.

Segmentierungsfehler, Unix, Compiler, C (Programmiersprache), Programmiersprachen, Computerprogrammierung