Как `напечатать '/ оценить функции шаблона 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, синтаксис тот же. Вы должны создать отдельный явный экземпляр для каждого другого списка параметров, с которым вы планируете вызывать шаблон.