Ich habe eine C-Anwendung, die wir auf einer Kundenseite bereitgestellt haben. Es wurde kompiliert und läuft auf HP-UX. Der Benutzer hat einen Absturz gemeldet und wir haben einen Core Dump erhalten. Bis jetzt konnte ich den Absturz nicht im Haus duplizieren.Debug Core-Datei ohne Symbole
Wie Sie vermuten würden, enthält die Core File/Deployed Executable keinerlei Symbole. Wenn ich es in GDB laden und eine bt tun, das Beste, was ich bekomme, ist dies:
(gdb) bt
#0 0xc0199470 in ??()
Ich kann auf der Datei einen ‚Strings Kern‘ tun, aber mein Verständnis ist, dass alles, was ich dort ist alles Strings in der ausführbaren Datei, so scheint es fast unmöglich, dort etwas zu finden.
Ich habe eine Debug-Version (kompiliert mit -g) der ausführbaren Datei, die leider ein paar Monate neuer als die veröffentlichte Version ist. Wenn ich versuche, mit dieser Nabe gdb zu starten, sehe ich dies:
warning: exec file is newer than core file.
Core was generated by `program_name'.
Program terminated with signal 11, Segmentation fault.
__dld_list is not valid according to __dld_flags.
#0 0xc0199470 in ??()
(gdb) bt
#0 0xc0199470 in ??()
Während es möglich wäre, eine Debug-Version zu kompilieren und es am Standort des Kunden zu implementieren und dann für einen weiteren Absturz warten, wäre es relativ schwierig sein, und aus einer Anzahl von Gründen unerwünscht.
Ich bin ziemlich vertraut mit dem Code und habe eine relativ gute Vorstellung davon, wo im Code es stürzt basierend auf dem Fehlerbericht des Kunden.
Gibt es irgendeine Möglichkeit, weitere Informationen von diesem Core Dump zu erhalten? Über Strings oder einen anderen Debugger oder irgendetwas? Vielen Dank.
Diese Antwort scheint mir lächerlich wahrscheinlich. Ich werde auf jeden Fall den Code für potentiell überlaufene Bereiche durchsehen. – Morinar
Wenn das Debuggen mit einer "Duplikatkopie" nichts anzeigt, ist es an der Zeit, Register- und Stack-Dumps zu betrachten, um herauszufinden, wie Sie in die Mitte von Nirgendwo gelangt sind. Es kann auch ein fehlerhafter (oder nicht initialisierter) Funktionszeiger, eine Zuordnungsüberschreitung oder möglicherweise eine falsche Puffergröße oder eine "schlechte" Eingabe sein, die einen Puffer durchbrennt (unter Verwendung von sprintf()/sscanf mit unkontrollierter Eingabe usw.). – jesup
Ich habe hier noch nie etwas herausgefunden, aber ich akzeptiere das, da es immer noch am wahrscheinlichsten ist. – Morinar