如何在gdb中“打印”/评估C++模板函数

13
我想知道是否可以使用gdb的print命令来评估C++模板函数的结果。在下面的代码中,我尝试使用一个简单的id函数,并尝试打印id(x)的结果,但好像id或id从未存在过一样。我使用的代码如下,使用"g++ -std=c++11 -g test7.cpp"编译:
template<typename T>
T id(T x) {return x;}

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

在GDB中,我尝试如下使用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.

你可以看到,我总是得到“无符号id”的错误。

关于在OSX中GDB不允许步入模板函数的问题,有一个相关的帖子:GNU GDB无法步入模板函数(OS X Mavericks)。在那里的答案中,模板函数至少可以被disassemble。而在我的情况下,即使disassemble也没有任何输出:

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

是否有可能评估模板函数?

P.S. 我使用的是来自TDM-GCC(4.8.1-2)的GDB 7.6.1。

谢谢。


2
尝试使用函数模板的显式实例化,在 main() 之前编写 template int id<int>(int);了解语法 - Nawaz
我尝试了 template int id<int>(int);,但是仍然出现相同的错误。另外,通常我们如何实例化可变参数模板函数? - thor
1个回答

7

如果源代码中没有明确的实例,编译器将把模板代码视为“静态内联”代码,并在未使用时将其优化掉。明确的实例将创建一个具有外部链接的符号(尽管它仍然可能被连接器在技术上优化掉,但在我的测试中并没有...):

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)

关于创建可变参数模板的显式实例的问题,语法与普通模板相同。您需要为计划使用模板调用的每个不同参数列表创建不同的显式实例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接