我想知道是否可以使用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;
}
Run Code Online (Sandbox Code Playgroud)
在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.
Run Code Online (Sandbox Code Playgroud)
如你所见,我总是得到"没有符号ID".
有一篇关于GDB的相关文章不允许在OSX中使用模板函数.在那里的答案中,模板函数至少可以是disassemble
d.在我的情况下,甚至disassemble
什么都没有:
(gdb) disassemble id<int>
No symbol "id<int>" in current context.
Run Code Online (Sandbox Code Playgroud)
是否可以评估模板功能?
PS我使用的是来自TDM-GCC(4.8.1-2)的GDB 7.6.1.
谢谢.
如果源代码中没有显式实例,编译器会将模板代码视为“静态内联”代码,并在未使用时对其进行优化。一个显式实例将创建一个带有外部链接的符号(虽然它仍然可以被链接器在技术上优化掉,但在我的测试中它没有......):
template<typename T>
T id(T x) {return x;}
template int id<int> (int x);
int main() {
int i = 0;
i = i + 1;
}
Run Code Online (Sandbox Code Playgroud)
在 中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)
Run Code Online (Sandbox Code Playgroud)
您在有关创建可变参数模板的显式实例的评论中提出的问题,语法是相同的。您必须为您计划用来调用模板的每个不同参数列表创建一个不同的显式实例。