2011-11-20 34 views
4

我正在C++中實現一個平衡樹,但是賦值的要求是我必須使用模板類。我以爲先用int整理然後轉換成模板,但我們給出的測試代碼默認使用模板。使用GDB進入模板類

當我用g ++ class.h編譯我的代碼時,test.cxx -Wall -g -O0似乎一切正常,直到我進入gdb,它不會進入模板實現。我的模板實現文件包含在頭文件的末尾,gdb允許我在其中設置斷點,但它實際上並沒有進入函數。我一直使用gdb通過emacs,但它不直接在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個函數互相調用。有沒有其他人經歷過這個並找到了解決方案?

+0

你使用的是哪個版本的GDB?什麼版本的GCC?這兩個方案最近在這些方面取得了進展。 (GCC 4.6,GDB 7.3) –

+1

難道你不能僅僅在頭文件中定義類,而不是包含輔助實現文件?如果你的老師不接受這個,那就去做吧,並且只要調試代碼 – jalf

+0

並且斷點行應該在C++文件中,就把代碼移回到實現文件中。所以你應該使用'b set.cc:10' –

回答

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可以調試模板就好了。

+0

頭文件和模板文件的確有一些DOS行結尾。我不確定他們爲什麼沒有出現在emacs中,通常他們顯示出一個愚蠢的^ M字符。我使用dos2unix工具來轉換爲我認爲是令人滿意的格式。在運行該實用程序之前和之後使用文件的md5sum創建校驗和顯示文件已更改,我通過更正EOL和EOF字符來假定。我更新了每個用來編譯我的集合測試代碼的文件,但它並沒有改變gdb的反應方式。你的解釋聽起來很合理,所以我會繼續玩。 – user1056153

+0

您可能想要在十六進制編輯器中查看文件,您可以在其中看到文件的每個字節。在每行結尾處,您應該只能看到Unix/Linux行尾的換行字符。 – Jason

+0

我在emacs中使用了hexl模式。轉換爲unix/linux格式的文件中的EOL爲0x0a,而在DOS格式中,它只是0x0d,而換行後是奇數。這些字符在所有情況下都是單個字符,除非中間有空行。 gdb仍然沒有運氣。我在舊分配上運行了反向操作unix2dos,並且gdb仍然能夠正常運行它們,即使行結束符已被更改爲0d 0a。我可以明白爲什麼gdb會因爲我的模板集類的原始文件而遇到麻煩,因爲根本沒有linux線路返回。 – user1056153