Как `напечатать '/ оценить функции шаблона C++ в gdb

Мне было интересно, если можно использовать GDB print команда для оценки результатов шаблонных функций C++. В следующем коде с простым id функция, я пытался print Результаты id(x), но это как будто id или же id<t> никогда не существовало Код, который я использую ниже, скомпилирован с g++ -std=c++11 -g test7.cpp:

template<typename T>
T id(T x) {return x;}

int main() {
  int i = 0;
  i = i + 1;
} 

В ГБД я пытался print следующее:

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<int>(i)
No symbol "id<int>" in current context.

Как вы видите, я всегда получаю "No symbol id".

Есть связанный пост о GDB, не позволяющем входить в функции шаблона в OSX. В ответах есть функция шаблона, по крайней мере, disassembleд. В моем случае даже disassemble ничего не дает

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

Можно ли вообще оценить функции шаблона?

PS Я использую GDB 7.6.1 из TDM-GCC (4.8.1-2).

Благодарю.

1 ответ

Без явного экземпляра в исходном коде компилятор будет обрабатывать код шаблона как "статический встроенный" код и оптимизировать его, если он не используется. Явный экземпляр создаст символ с внешней связью (хотя он все еще может быть технически оптимизирован компоновщиком, но в моем тесте он не...):

template<typename T>
T id(T x) {return x;}

template int id<int> (int x);

int main() {
  int i = 0;
  i = i + 1;
} 

В gdbЯ помещаю функцию C++, которую хочу вызвать, в одинарные кавычки:

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

Ваш вопрос в вашем комментарии о создании явного экземпляра шаблона variadic, синтаксис тот же. Вы должны создать отдельный явный экземпляр для каждого другого списка параметров, с которым вы планируете вызывать шаблон.

Другие вопросы по тегам