Wie debugge ich einen Absturz vor main?

7

Mein Programm verbindet sich statisch mit vielen Bibliotheken und stürzt ab, bevor es in gdb zu main geht. Wie diagnostiziere ich das Problem?

    
chacham15 18.10.2011, 14:19
quelle

7 Antworten

3

Beginnen Sie, die Bibliotheken nacheinander zu entfernen, bis sie nicht mehr abstürzen. Untersuche dann den Täter.

    
MK. 18.10.2011, 14:24
quelle
9

Es ist eine gute Wette, dass LD_DEBUG Ihnen hier helfen kann. Versuchen Sie Folgendes: LD_DEBUG=all ./a.out . Dadurch können Sie die Bibliothek, die geladen wird, wenn Ihr Programm abstürzt, leicht identifizieren.

(Bearbeiten: Wenn es nicht klar war, bezieht sich a.out auf eine generische Binärdatei - ersetzen Sie sie in diesem Fall durch den Namen Ihrer ausführbaren Datei).

Bearbeiten 2:

Zur Klarstellung ist LD_DEBUG eine Umgebungsvariable, die vom dynamischen Linker untersucht wird, wenn ein Programm mit der Ausführung beginnt. Wenn LD_DEBUG auf einen Wert gesetzt ist, gibt der dynamische Linker viele Informationen über die dynamischen Bibliotheken aus, die während der Programmausführung, Symbolbindung usw. geladen werden.

Führen Sie zunächst Folgendes auf Ihrem Computer aus:

%Vor%

Sie sehen die gültigen Optionen für LD_DEBUG auf Ihrem System aufgelistet. Die ausführlichste Einstellung ist all , die alle verfügbaren Informationen anzeigt.

Um dies zu verwenden, ist das so einfach wie das Beispiel ls , ersetzen Sie nur ls durch den Namen Ihres Programms. Es gibt keine Notwendigkeit für gdb, um LD_DEBUG zu verwenden, da es nur vom dynamischen Linker und nicht von gdb zur Verfügung gestellt wird.

    
proc-self-maps 18.10.2011 15:26
quelle
3

Dieser Post hat die Antwort, Sie müssen einen Breakpoint vor main im Startcode crt0 setzen: GDB verwenden, ohne Symbole auf x86 zu debuggen?

    
TJD 18.10.2011 16:31
quelle
2

Ich bin nicht in C hineingelaufen, aber wenn Sie eine Verbindung zu einer C ++ - Bibliothek herstellen, kann die statische Initialisierung abstürzen. Sie können es einfach erstellen, indem Sie in einem Konstruktor eine statische Bereichsvariable setzen.

    
rerun 18.10.2011 14:22
quelle
2

Es kann zum Absturz kommen, weil eine Komponente eine Ausnahme auslöst und niemand sie abfängt, da main() noch nicht eingegeben wurde. Legen Sie beim Auslösen einer Ausnahme einen Haltepunkt fest:

%Vor%

(Wenn catch throw beim ersten Start nicht funktioniert, führe es einmal aus, damit es die dynamischen Bibliotheken lädt und mache dann catch throw und starte es erneut.)

    
Maxim Egorushkin 18.10.2011 14:25
quelle
1

Wenn Sie können, verknüpfen Sie Ihr Programm dynamisch statt statisch und folgen Sie @ denniston.t Antwort . Vielleicht helfen Debug-Trace von Dynamic Linker, um dieses Problem zu beheben.

    
ks1322 18.10.2011 18:45
quelle
0

Um bei der ersten Anweisung entweder zu stoppen:

%Vor%

Wenn Sie wissen, dass der Name der Einstiegspunktmethode _start oder:

lautet %Vor%

suche nach Entry point :

%Vor%

und run:

%Vor%

Entnommen aus der Teilmengenfrage: Stoppen beim ersten Maschinencode Anweisung in GDB

    
quelle

Tags und Links