2016-06-03 4 views
2

Sagen wir, ich bin mit GDB auf einem komplizierten Stück Templat C++ Code, und ich möchte wissen, welche Arten in der aktuellen Instanciation sind ... zum Beispiel:Haben GDB den Typ eines Template-Argument zeigen

template <typename T> 
void foo() 
{ 
/// I've got a breakpoint in here somewhere. 
} 

Also habe ich meinen Haltepunkt getroffen, und ich möchte wissen, welcher Typ T ist. Wie kann ich das machen?

Antwort

3

Gerade frame in GDB Aufforderung:

(gdb) frame 

Die Funktion Name zusammen mit Vorlage Argument wird in der ersten Ausgabezeile ausgegeben. Siehe online doc:

Alle diese Befehle beenden, indem Drucken von zwei Zeilen der Ausgabe der Rahmen beschreibt. Die erste Zeile zeigt die Bildnummer, den Funktionsnamen, die Argumente und die Quelldatei und Zeilennummer der Ausführung in diesem Rahmen. Die zweite Zeile zeigt den Text dieser Quellzeile.

0

Wie kann ich das tun?

Dies wird Ihnen verstümmelten Namen des aktuellen Symbol geben:

(gdb) info symbol $pc 

Dieser Sie Namen demangled geben:

(gdb) main demangle symbol_name 
(gdb) shell c++filt symbol_name 
2

Wenn Ihr Compiler gibt für Template-Parameter Informationen richtigen Debugging (für non-variadic Vorlagen, gcc hat dies seit mehreren Jahren getan), können Sie einfach auf T verweisen, als wäre es ein gewöhnlicher Typ, z mit ptype.

habe ich versucht, dieses Testprogramm:

template<typename T> 
T f() 
{ 
    return 23; 
} 

int main() 
{ 
    return f<int>(); 
} 

Compiled mit -g und einen Haltepunkt in f gesetzt:

(gdb) b 4 
Breakpoint 1 at 0x4005c5: file q.cc, line 4. 
(gdb) r 
Starting program: /tmp/q 

Breakpoint 1, f<int>() at q.cc:4 
4  return 23; 
(gdb) ptype T 
type = int 
0

könnten Sie auch brechen regexp wie folgt verwendet:

(gdb) rbreak foo<.*>() 

Dies kann auch

(gdb) rbreak MyClass<.*>::my_method() 
auf Templat-Klasse Methoden angewendet werden,
Verwandte Themen