2016-05-16 11 views
0

Ich debugg gerade ein Programm, das ein paar Dateien hat: arr.h ist die Header-Datei für eine List-Klasse, die ein Array von (zufällig erzeugten) verknüpften Listen erstellt. Howard.cpp ist die Implementierungsdatei, und in main.cpp stelle ich die Hauptfunktion ein, die Funktionen für Objekte der Listenklasse aufruft. es enthält list.h. Ich bekomme einen seg-Fehler für eine meiner Funktionen (implementiert in Howard.cpp). Ich habe GDB eingegeben. Wenn der Seg-Fehler auftritt, weiß ich, wo "where" oder "list" einzugeben ist, um die Funktionsaufrufe zu erhalten, die zu dem Seg-Fehler geführt haben. In diesem Fall, wenn ich zu der Funktion komme, bei der der Seg-Fehler aufgetreten ist (Rahmen 0), möchte ich die Variablen sehen und welche ihre Werte in dieser Funktion sind. Wenn ich jedoch versuche, in diese spezielle Funktion zu gehen oder "info locals" einzugeben, erhalte ich die Meldung, dass "Keine Symboltabelleninformationen verfügbar" sind. Ich weiß, dass das nicht stimmt, aber ich kann mir nicht vorstellen, wie ich die Linie sehen kann, wo sie versagt hat. Darüber hinaus werden alle Zeileninformationen zu dieser Funktion/Datei nicht angezeigt. Ich denke, es hat etwas damit zu tun, dass der Fehler in einer Funktion in einer Datei liegt, die nicht ausführbar ist. aber was kann ich dagegen tun? Wenn diese Frage überhaupt verwirrend ist, können Sie mich um eine Klarstellung bitten. Ich bin ziemlich neu bei all dem.Debuggen mit mehreren verknüpften Dateien in GDB

Dies ist auf einer Linux-Terminal-Umgebung, die vom Professor meiner Klasse erstellt wurde und zum Üben verknüpfter Listen und Rekursion gedacht ist.

Ok, ich werde ein Beispiel schließen hier:

Ich habe eine Funktion, die rekursiv kopiert ein Array von verknüpften Listen in umgekehrter Richtung. Die rekursive Funktion heißt table :: reverse_table (Knoten * &, Knoten *, Knoten *). Ich habe es bis zu dem Punkt debugged, wo ich weiß, dass es kein Problem mit dem Haltepunkt gibt. Wenn das Programm segfaults, ich werde geben "wo", und es wird ausgegeben:

#0 0x0000000000400e6e in table::reverse_table(node*&, node*, node*)() 
#1 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#2 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#3 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#4 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#5 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#6 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#7 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#8 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#9 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#10 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#11 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#12 0x0000000000400f87 in table::reverse_table(table&, int, int)() 
#13 0x0000000000400fe7 in table::reverse_table(table&)() 
#14 0x0000000000401087 in main() 

Dann, als ich "frame 0", geben Sie es zeigt:

#0 0x0000000000400e6e in table::reverse_table(node*&, node*, node*)() 

Wenn ich schreibe „info Einheimische, "dann" Keine Symboltabelleninfo verfügbar "wird angezeigt. Ich kann keine Information darüber erhalten, wo in der Funktion der Segfault aufgetreten ist; GDB scheint diese Information nicht zu haben. Gibt es etwas, das ich tun muss, um es während des Debuggens einzuschließen?

+0

Sie könnten ein SSCCE (http://sscce.org/) hinzufügen - das würde es klarer machen. –

+0

hat die gdb-Nachrichten hinzugefügt, die ich beim Debuggen gesehen habe. Hoffentlich ist das genug Info. Ich möchte meinen Code nicht wirklich posten, weil ich nicht möchte, dass ich nur versuche, eine Lösung für mein Problem zu finden. Ich versuche herauszufinden, wie ich mein Problem selbst beheben kann. – hhoward

Antwort

2

Ich hoffe, Debug-Flag (-g) wurde während Compilaton aktiviert. Sie erhalten diese Nachricht, weil der Prozess beendet wurde und keine Symboltabelleninformationen verfügbar sind. Sie sollten versuchen, Ihr Programm über gdb auszuführen, und wenn der seg-Fehler auftritt; Verwenden Sie den Befehl bt (backtrace), um die letzte Funktion zu überprüfen, die den Segmentierungsfehler verursacht. Führen Sie Ihr Programm erneut aus, indem Sie einen Haltepunkt für diesen Funktionseinstiegspunkt verwenden. Überprüfen Sie mit dem nächsten Befehl oder info den Wert von Locals.

+0

Ich mache das schon; Selbst wenn das Programm nicht beendet wird, zeigt es keine Symboltabelleninformationen für irgendwelche anderen Funktionen als main an, die einfach die Funktionen aufrufen, die ich zum Debuggen benötige. – hhoward

+0

Ok, das ist peinlich, aber das Hinzufügen von -g, wenn ich kompiliert habe, habe es komplett repariert. Ich dachte, dass es vom Professor aufgenommen wurde. – hhoward