2016-05-16 62 views
0

我正在調試一個程序,它有幾個文件:arr.h是列表類的頭文件,它創建一個鏈接列表(隨機生成)的數組。 Howard.cpp是實現文件,main.cpp是我把主函數調用到列表類的對象上的地方。它包含list.h.我正在爲我的一個函數(在Howard.cpp中實現)獲取seg錯誤。我進入了GDB。當seg故障發生時,我知道輸入「where」或「list」以獲得導致seg故障的功能調用。在這種情況下,當我遇到發生seg錯誤的函數(第0幀)時,我想查看變量以及它們在該函數中的值。但是,當我嘗試進入該特定功能時,或鍵入「信息當地人」時,我收到消息「沒有符號表信息可用」。我知道這不是事實,但我無法弄清楚如何能夠看到失敗的路線。此外,關於該功能/文件的任何行信息都不會顯示。我認爲它與在不是可執行文件的文件中的函數中的錯誤有關;但我能做些什麼呢?如果這個問題令人困惑,請隨時向我澄清。在這一切上我都很新。使用GDB中的多個鏈接文件進行調試

這是一個linux終端環境,由我的課教授創建,旨在練習鏈表和遞歸。

好了,我要在這裏包括一個例子:

我有一個函數,遞歸副本反向鏈接列表的數組。遞歸函數稱爲table :: reverse_table(node * &,node *,node *)。我已經調試到了我知道停車點沒有問題的地步。當程序段錯誤,我將輸入「其中,」它會輸出:

#0 0x0000000000400e6e in table::reverse_table(node*&, node*, node*)() 
#1 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#2 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#3 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#4 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#5 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#6 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#7 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#8 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#9 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#10 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#11 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#12 0x0000000000400f87 in table::reverse_table(table&, int, int)() 
#13 0x0000000000400fe7 in table::reverse_table(table&)() 
#14 0x0000000000401087 in main() 

然後,當我鍵入「幀0」,它顯示:

#0 0x0000000000400e6e in table::reverse_table(node*&, node*, node*)() 

當我鍵入「信息當地人「,則顯示」沒有可用的符號表信息「。我無法獲得有關段錯誤發生的函數在哪裏的任何信息; GDB似乎沒有這些信息。在調試時需要做些什麼來包含它?

+0

你可以添加一個SSCCE(http://sscce.org/) - 這會讓它更清晰。 –

+0

添加了我在調試時看到的gdb消息。希望這是足夠的信息。我真的不想發佈我的代碼,因爲我不希望它出現,我只是想解決我的問題。我試圖弄清楚如何自己調試我的問題。 – hhoward

回答

2

我希望在編譯期間啓用調試標誌(-g)。 您正在收到此消息,因爲該進程已終止,並且沒有可用的符號表信息。您應該嘗試通過gdb運行您的程序,並且在發生seg錯誤時;使用bt(backtrace)命令檢查導致分段錯誤的最後一個函數。通過在該函數入口點上使用斷點再次運行您的程序。用下一個命令或信息命令檢查當地人的價值。

+0

我一直在這樣做;即使程序沒有終止,它也不會顯示除main之外的任何函數的任何符號表信息,它只是調用我需要調試的函數。 – hhoward

+0

好的,這是令人尷尬的,但當我編譯完全修復它時添加-g。我認爲它被教授包括在內。 – hhoward