2009-05-27 6 views
9

Ich habe Linux C++ Multithread-Anwendung. Jetzt ist es auf Produktionsservern getestet und hat segfault. Problem ist, dass ich diesen Fehler auf keinem meiner Testserver reproduzieren kann und keinen Zugriff auf Produktionsserver habe. Ich habe keine Müllkippe oder andere nützliche Informationen. Nur Zeile: segfault bei 0000000046bf0fb8 rip 000000000048ac6b rsp 0000000046bf0fa0 Fehler 6Linux/C++ Wie Debug Release-Anwendung

Ich mag würde Community fragen kann ich von einer solchen Linie, die Fläche verringern helfen möglicher Orte einige Informationen bekommen, wo ich suchen soll. Ich kann wegen der langsamen Geschwindigkeit kein Debug-Build für die Produktion ausführen. Was kann ich zur Veröffentlichung hinzufügen, die mir beim Debuggen helfen? Dieser Fehler sieht wie Multithread-Fehler aus und ist schwer zu reproduzieren. Aber ich bin nicht sicher, weil Anwendung mit vielen verschiedenen E-Mails von MTA funktioniert.

Plattform: Linux

Compiler line: g ++ O3 -D_REENTRANT

Danke.

upd .: Vielen Dank für Ihre Antworten. Ich kann Debug-Informationen einschließen. Ich würde gerne die grundlegenden Methoden zum Debuggen von Release-Builds kennen. Zum Beispiel habe ich Dump und Release-Version. Wie soll ich weitermachen? Was soll ich darüber lesen? Können Sie in wenigen Worten erklären, wie Sie Ihre Anwendung nach Möglichkeit debuggen? Vielen Dank.

Antwort

5

Ich habe die gdb Handbücher vor kurzem gelesen, und sie empfehlen, die Debugging-Symbole in z. g++ -g.

Da Sie keinen Zugriff auf den Produktionsserver haben, können Sie einige grundlegende Protokollierungsfunktionen verwenden, die Daten in eine Textdatei ausgeben. Je nachdem, welche Daten in Ihre Protokolldatei ausgegeben wurden, sollten Sie grob eingrenzen können, wo der Fehler auftritt.

12

Wie Andy erwähnt, lassen Sie die Debugging-Symbole in, wenn Sie Ihre Releasebuilds machen.

Wenn dies die Größe der fertigen ausführbaren Datei inakzeptabel groß macht, können Sie eine Kopie der endgültigen ausführbaren Datei erstellen und sie über strip ausführen, um die Debugsymbole zu entfernen. Auf diese Weise haben Sie zwei ausführbare Dateien, die identisch sind, außer einer hat Debug-Symbole und der andere nicht. Lege das ohne Symbole auf den Produktionsserver. Wenn es defaults gibt, debuggen Sie mit der Kopie der ausführbaren Datei, die noch Debug-Symbole enthält.

3

Sie können (und sollten) Release-Executables mit Debug-Informationen erstellen. Wenn Sie keine ausführbaren Dateien mit den Debuginformationen verteilen möchten, können Sie die Debuginformationen separate eingeben und später zum Debuggen installieren. Das machen wir in unserer Anwendung.

+0

Danke. Ich kann Debug-Informationen einschließen. Ich würde gerne die grundlegenden Methoden zum Debuggen von Release-Builds kennen. Zum Beispiel habe ich Dump und Release-Version. Wie soll ich weitermachen? Was soll ich darüber lesen? Können Sie in wenigen Worten erklären, wie Sie Ihre Anwendung nach Möglichkeit debuggen? Vielen Dank. – Dmitriy

+0

@Dmitriy Das Debuggen von Release-Builds unterscheidet sich in keiner Weise vom Debuggen von Debug-Builds. Sie können feststellen, dass Sie bestimmte Variablen nicht sehen können, wenn Sie den Code durchgehen, da der Compiler sie möglicherweise von diesem Ort aus optimiert hat, aber ansonsten ist es genauso schwierig, einen Nicht-Release-Build zu debuggen. – lothar

4

Sie können gdb verwenden, um ein Backtrace Ihres Programms an dem Punkt zu erhalten, an dem es defaults gibt, obwohl Sie Ihre Anwendung nicht mit den Debug-Flags erstellt haben. Dies wird Ihnen zumindest eine Vorstellung davon geben, wo Ihre Anwendung segmentiert ist.

gdb <your_app_exe> 
gdb> run 
gdb> backtrace 

oder

gdb <your_app_exe> 
gdb> core-file <generated_core_file> 
1

gut finde ich eine andere Lösung, die ich sehr häufig verwenden, wir normalerweise den Stapel bekommen (was wir in diesem Fall bekamen).

Ich habe eine ausführbare Datei, die wir auf einigen eingebetteten Plattformen bereitstellen. Lassen Sie sagen, dass meine ausführbare Datei Server ist. ich benutze addr2line -e./ Server und ich füge den Stapel ein, den ich vom Kunden bekommen habe. es gibt Ihnen die Details der Linie, wo Problem auftritt.

könnte es Ihnen helfen.

Danke