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

时间:2014-07-25 13:52:37

标签: c++ templates gdb

我想知道是否可以使用gdb print命令来评估c ++模板函数的结果。在以下带有简单id功能的代码中,我尝试了print id(x)的结果,但好像idid<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;
} 

在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”。

有一篇关于GDB not allowing stepping into template functions in OSX的相关帖子。在那里的答案中,模板函数至少可以是disassemble d。就我而言,即使disassemble也没有任何结果:

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

是否可以评估模板功能?

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

感谢。

1 个答案:

答案 0 :(得分:3)

如果源代码中没有显式实例,编译器会将模板代码视为“静态内联”代码,并在未使用时对其进行优化。一个显式实例将创建一个带有外部链接的符号(尽管它仍然可以通过链接器在技术上进行优化,但在我的测试中它没有......):

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)

关于创建可变参数模板的显式实例的评论中的问题,语法是相同的。您必须为计划用模板调用模板的每个不同参数列表创建不同的显式实例。