2013-02-05 11 views
6

Ein Programm von mir wirft eine std::out_of_range. Ich kenne den Grund dafür, ich greife irgendwo auf einen Vektor mit Index -1. Was ich nicht weiß, ist der Name des Vektors (Variablenname) und der Ort im Code. Die Fehlermeldung von meinem Programm erzeugt wie folgt aussieht:Finden Objekt werfen std :: out_of_range

terminate called after throwing an instance of 'std::out_of_range' 
    what(): vector::_M_range_check 
zsh: abort (core dumped) ./main.x config.cfg 

während die Fehlermeldung durch den Code von einem anderen Typen produziert (er verwendet g++ auch) und in der Frage gepostet C++ accessing vector sieht wie folgt aus:

Error for vec.at(i).setVec(tmp); 
Error is: terminate called after throwing an instance of 'std::out_of_range' 
    what(): vector::_M_range_check 

Ie Ihm wird der Name der Variablen mitgeteilt. Meine Frage ist:

Gibt es eine Möglichkeit zu sagen g++/gcc, um mir die erweiterten Informationen zu geben? Vielleicht sogar Zeilennummern (weiß nicht, ob das möglich ist, aber hey, ein Typ kann träumen;)).
Nur für Spaß Ich lief mein Programm in gdb mit der catch thrown Option (ich könnte hinzufügen, ich habe fast keine Erfahrung in der Verwendung eines tatsächlichen Debugger), die mir nichts Neues auch gesagt hat, tatsächlich, es hat mir nicht gesagt dass der Fehler auf eine std::out_of_range Ausnahme zurückzuführen ist.

Btw, mein Compiler-Flags (für Debug) sind:

CFLAGS = --exceptions -I$(ROOTSYS)/include --std=c++11 -Wall -g -O0 -fno-inline -fno-eliminate-unused-debug-types 
+9

Nach dem Ausführen von 'gdb' mit' catch throw', geben Sie 'where' ein, wenn die Ausnahme abgefangen wird. –

+0

@DavidSchwartz Perfekt! So, jetzt habe ich Zeilennummern von 'gdb', irgendeine Chance, die zweite Fehlermeldung (d. H. Name ohne Debugger) zu bekommen? – elemakil

Antwort

3

Nachdem Sie den Haltepunkt erreicht haben, geben Sie in der gdb-Shell den Befehl bt (backtrace) ein. Dies wird die Stack-Trace (eine Folge von Funktionsaufrufen, die zu dem Fehler führen) drucken.

Um den Variablennamen zu erhalten, können Sie jetzt den Befehl up verwenden, um im Stapel nach oben zu navigieren und zu sehen, welche Variablen in jeder dieser Funktionen verwendet wurden.

+0

Dies funktioniert wie erwartet, nachdem die Zeile mit dem fehlerhaften Code gedruckt wurde, nachdem sie an den Anfang des Stapels gegangen ist (d. H. Mehrere "Aufwärts" -Befehle). – elemakil

3

auf std::out_of_range::out_of_range einen Haltepunkt. Ein Ausnahmeobjekt, wie alle C++ - Objekte, startet seine Lebensdauer, nachdem der Konstruktor beendet wurde.

[EDIT] Kommentar machte es klar: das Problem der String von std::out_of_range::what() produziert. Das ist implementierungsdefiniert. Offensichtlich besteht es in Ihrem Fall aus __FUNCTION__, einem GCC-Makro, das die aktuelle (d. H. Das Werfen) -Funktion bezeichnet. Aber eine solche Funktion kennt nur this, d.h. den Zeiger auf das aktuelle Objekt und nicht seinen Namen. Im anderen Fall wird der Objektname über eine andere Methode abgerufen, nicht std::out_of_range::what().

+0

Ich nehme an, Sie meinen, dass ich 'break std :: out_of_range :: out_of_range' in' gdb' vor dem Ausführen der Anwendung ausführen (d. H. Befehl 'run'). Dies hat nur den gleichen Effekt wie 'catch throw', also gibt' where' nach Erreichen des Breakpoints (wie von @DavidSchwartz vorgeschlagen) die Zeilennummer aus. Aber ähnlich wie bei seiner Lösung wird ein Debugger benötigt, oder? Das heißt, die zweite Fehlermeldung kann mit dieser Methode nicht erreicht werden. – elemakil

+0

Ich nehme an, dass es keine einfache Möglichkeit gibt, die Funktionalität zum Drucken des Objektnamens hinzuzufügen? – elemakil

+0

@elemakil: Nein, das ist der Punkt. Die Funktion, die _does_ den 'this'-Zeiger auf das Objekt und seinen eigenen Funktionsnamen, jedoch nicht den Objektnamen, meldet. (Abgesehen von der philosophischen Frage, was _der_ Objektname überhaupt ist - hängt das normalerweise davon ab, wie tief Sie im Callstack sind). – MSalters

Verwandte Themen