使用GDB进入模板类

时间:2011-11-20 08:45:51

标签: c++ templates gdb

我正在尝试用c ++实现一个平衡树,但是赋值的要求是我必须使用模板类。我想先用int进行,然后转换为模板,但我们给出的测试代码默认使用模板。

当我使用g ++ class.h test.cxx -Wall -g -O0编译我的代码时,一切似乎都工作正常,直到我进入gdb,它不会进入模板实现。我的模板实现文件包含在头文件的末尾,而gdb将允许我在其中设置断点,但它实际上从未进入该函数。我一直在通过emacs使用gdb,但它也没有直接在gdb中工作。当GDB进入一个在那里得到启发的函数时,我希望这一步切换到模板文件,但它告诉我,它认为应该去的那条线并不存在。这是一个典型的会议:

(gdb) break set.template:7
Breakpoint 3 at 0x400c46: file set.template, line 7.
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/students/jeffris/csci2270/btree/debug

Breakpoint 1, main () at debug.cxx:9
(gdb) step

Breakpoint 3, set (this=0x7fffffffe550) at set.template:7
Line number 7 out of range; set.template has 1 lines.
(gdb) 
set()
Line number 8 out of range; set.template has 1 lines.
(gdb)  
Line number 9 out of range; set.template has 1 lines.
(gdb) 
Line number 10 out of range; set.template has 1 lines.
(gdb) 
main () at debug.cxx:10
(gdb) 
main_savitch_11::set<int>::empty (this=0x7fffffffe550) at set.template:70
Line number 70 out of range; set.template has 1 lines.
(gdb) 
empty
Line number 71 out of range; set.template has 1 lines.
(gdb)  
Line number 72 out of range; set.template has 1 lines.
(gdb) 

我在网上发现了几个有类似问题的人的帖子,但线程都没有解决就死了。我已经尝试了几种编译代码的方法,包括单独的部分,然后将它们全部链接在一起,但没有骰子。我班上的其他人都有同样的问题,但是他们已经满足于使用cout语句进行调试,这是调试10个函数相互调用的非常缓慢的方法。有没有其他人经历过这个并找到了解决方案?

1 个答案:

答案 0 :(得分:3)

问题看起来像您用于调试的平台上的gdb无法找到set.template文件的行尾分隔符。例如,调试符号似乎指向正确的行号:

(gdb) break set.template:7
Breakpoint 3 at 0x400c46: file set.template, line 7.

但是你得到的错误信息是

Line number 7 out of range; set.template has 1 lines.

因此gdb会看到你的set.template文件,但它无法正确解析它并查看行尾分隔符,以便实际告诉要查看的行号。例如,如果您在Linux中编写了一个文件,然后在Windows上编译它,就会发生这种情况。 Linux / Unix只需要换行换行,因为Windows需要回车+换行组合。因此,在您正在调试的平台上的文本编辑器中打开您的set.template文件,并确保您的文件不是单行。可能还有其他原因导致gdb在文件行上窒息,但是无法在实际代码文件中看到行尾,这基本上是您遇到问题的原因,与无能力无关调试模板... gdb可以很好地调试模板。