Come `stampare` / valutare le funzioni template c ++ in gdb

Mi stavo chiedendo se è ansible utilizzare il comando gdb print per valutare i risultati delle funzioni template c ++. Nel codice seguente con una semplice funzione id , ho provato a print risultati di id(x) , ma è come se id o id non siano mai esistiti. Il codice che uso è sotto, compilato con g++ -std=c++11 -g test7.cpp :

 template T id(T x) {return x;} int main() { int i = 0; i = i + 1; } 

In GDB, ho provato a print come segue:

 Breakpoint 1, main () at test7.cpp:6 6 i = i + 1; (gdb) print i $1 = 0 (gdb) print id(i) No symbol "id" in current context. (gdb) print id(i) No symbol "id" in current context. 

Come puoi vedere, ottengo sempre “Nessun ID di simbolo”.

C’è un post correlato su GDB che non consente di entrare nelle funzioni dei modelli in OSX . Nelle risposte lì, la funzione template può essere almeno disassemble d. Nel mio caso, persino disassemble non dà nulla:

 (gdb) disassemble id No symbol "id" in current context. 

È ansible valutare le funzioni del modello?

PS Sto usando GDB 7.6.1 proveniente da TDM-GCC (4.8.1-2).

Grazie.

Senza un’istanza esplicita nel codice sorgente, il compilatore tratterà il codice del modello come se fosse un codice “statico in linea” e lo ottimizzerà se non è utilizzato. Un’istanza esplicita creerà un simbolo con un collegamento esterno (anche se potrebbe essere tecnicamente ottimizzato via dal linker, ma nel mio test non lo ha fatto …):

 template T id(T x) {return x;} template int id (int x); int main() { int i = 0; i = i + 1; } 

All’interno di gdb , inserisco la funzione C ++ che voglio chiamare tra virgolette singole:

 Breakpoint 1, main () at tmpl.cc:7 7 int i = 0; (gdb) n 8 i = i + 1; (gdb) pi $1 = 0 (gdb) p 'id(int)'(i) $2 = 0 (gdb) 

La tua domanda nel tuo commento sulla creazione di un’istanza esplicita di un modello variadico, la syntax è la stessa. Devi creare un’istanza esplicita diversa per ciascun elenco di parametri con cui prevedi di chiamare il modello.