c – GNU gdb无法进入模板函数(OS X Mavericks)
发布时间:2020-12-16 05:31:37 所属栏目:百科 来源:网络整理
导读:我在OS X Mavericks(10.9.2)下安装了gdb 7.7(来自GNU源).我编码了它,所以当我调试不包含模板的c文件时它工作正常.但是,它无法进入模板函数(可以进入常规函数,但是不能进入模板函数).当我在调试会话中键入step命令时,它只是跨越该功能,就好像模板函数中不存在
我在OS X Mavericks(10.9.2)下安装了gdb 7.7(来自GNU源).我编码了它,所以当我调试不包含模板的c文件时它工作正常.但是,它无法进入模板函数(可以进入常规函数,但是不能进入模板函数).当我在调试会话中键入step命令时,它只是跨越该功能,就好像模板函数中不存在调试符号一样.我的模板功能甚至不是一个成员函数,只是在main.cpp中定义的一个简单的函数.
我用g -g -O0 main.cpp编译我的程序(我使用g 4.8.2从macports而不是clang),甚至尝试-fno-inline,仍然相同的行为,不能进入模板函数.这是一个gdb已知问题在OS X小牛?或者,任何人都可以重现错误? 我的代码: #include <iostream> template <typename T> // template void f(T x) { std::cout << "In f:" << std::endl; std::cout << x << std::endl; } void g() // non-template { std::cout << "It works here!" << std::endl; std::cout << "Exiting g()..." << std::endl; } int main() { f<double>(12.3); // gdb does not step into f() g(); // gdb steps into g() } 在f< double>(12.3)的断点之后不能进入f. 更新:gdb在任何其他操作系统下工作,如linux / windows / solaris.这似乎是与OS X相关的问题. Reading symbols from a.out...done. (gdb) disassemble main Dump of assembler code for function main(): 0x0000000100000d62 <+0>: push %rbp 0x0000000100000d63 <+1>: mov %rsp,%rbp 0x0000000100000d66 <+4>: movabs $0x402899999999999a,%rax 0x0000000100000d70 <+14>: movq %rax,%xmm0 0x0000000100000d75 <+19>: callq 0x100000e44 0x0000000100000d7a <+24>: callq 0x100000d0c <g()> 0x0000000100000d7f <+29>: mov $0x0,%eax 0x0000000100000d84 <+34>: pop %rbp 0x0000000100000d85 <+35>: retq End of assembler dump. (gdb) 现在我们在main()的入口处设置一个断点 (gdb) b main Breakpoint 1 at 0x100000d66: file src/templated_bug.cpp,line 22. (gdb) r Starting program: /Users/vlad/template_gdb_bug/a.out Breakpoint 1,main () at src/templated_bug.cpp:22 22 f<double>(12.3); (gdb) s In f: 12.3 23 g(); (gdb) s g () at src/templated_bug.cpp:16 16 cout<<"It works here!"<<endl; (gdb) s It works here! 17 cout<<"Exiting g()..."<<endl; (gdb) s Exiting g()... 18 } (gdb) s main () at src/templated_bug.cpp:24 24 } (gdb) s [Inferior 1 (process 50945) exited normally] (gdb) 你可以看到,它不会进入f(),而是在g()中的步骤.此外, (gdb) disassemble f No symbol "f" in current context. 然而,对于非模板的另一个函数g(),这些符号被加载,我可以反汇编. (gdb) disassemble g Dump of assembler code for function g(): 0x0000000100000d0c <+0>: push %rbp 0x0000000100000d0d <+1>: mov %rsp,%rbp 0x0000000100000d10 <+4>: lea 0x193(%rip),%rsi # 0x100000eaa 0x0000000100000d17 <+11>: mov 0x2ea(%rip),%rax # 0x100001008 0x0000000100000d1e <+18>: mov %rax,%rdi 0x0000000100000d21 <+21>: callq 0x100000e5c 0x0000000100000d26 <+26>: mov 0x2e3(%rip),%rdx # 0x100001010 0x0000000100000d2d <+33>: mov %rdx,%rsi 0x0000000100000d30 <+36>: mov %rax,%rdi 0x0000000100000d33 <+39>: callq 0x100000e4a 0x0000000100000d38 <+44>: lea 0x17a(%rip),%rsi # 0x100000eb9 0x0000000100000d3f <+51>: mov 0x2c2(%rip),%rax # 0x100001008 0x0000000100000d46 <+58>: mov %rax,%rdi 0x0000000100000d49 <+61>: callq 0x100000e5c 0x0000000100000d4e <+66>: mov 0x2bb(%rip),%rdx # 0x100001010 0x0000000100000d55 <+73>: mov %rdx,%rsi 0x0000000100000d58 <+76>: mov %rax,%rdi 0x0000000100000d5b <+79>: callq 0x100000e4a 0x0000000100000d60 <+84>: pop %rbp 0x0000000100000d61 <+85>: retq End of assembler dump. 解决方法
在gdb的MacOS端口看来似乎有一个问题.作为解决方法,您可以在函数开始设置断点进入模板函数:
(gdb) b f<double> Breakpoint 1 at 0x1000015ab: file ./gdb_tmpl.cpp,line 6. (gdb) run Starting program: /Users/vershov/tmp/tests/a.out Breakpoint 1,f<double> (x=12.300000000000001) at ./gdb_tmpl.cpp:6 6 std::cout << "In f:" << std::endl; 此外,您可以拆卸它,只需使用正确的命令: (gdb) disass f No symbol "f" in current context. (gdb) disass f<double> Dump of assembler code for function f<double>(double): 0x0000000100001590 <+0>: push %rbp 0x0000000100001591 <+1>: mov %rsp,%rbp 0x0000000100001594 <+4>: sub $0x40,%rsp 0x0000000100001598 <+8>: mov 0xa71(%rip),%rdi # 0x100002010 0x000000010000159f <+15>: lea 0x9a0(%rip),%rsi # 0x100001f46 ... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |