2012-06-02 103 views
2
0x004069f1 in Space::setPosition (this=0x77733cee, x=-65, y=-49) at space.h:44  
0x00402679 in Checkers::make_move (this=0x28cbb8, move=...) at checkers.cc:351 
0x00403fd2 in main_savitch_14::game::make_computer_move (this=0x28cbb8) at game.cc:153 
0x00403b70 in main_savitch_14::game::play (this=0x28cbb8) at game.cc:33 
0x004015fb in _fu0___ZSt4cout() at checkers.cc:96 
0x004042a7 in main() at main.cc:34 

你好,我編碼一個遊戲類和我遇到一個段錯誤。檢查器件保存在一個二維數組中,因此該數組的出錯位似乎是無效的x/y。這些動作是作爲字符串傳遞的,它們被轉換爲整數,因此x和y以某種方式是ASCII NULL。我注意到,在函數調用make_move它說,此舉= ...如何解釋GDB回溯?

爲什麼它說此舉= ...?另外,解決segfault的任何其他快速提示?我對GDB很陌生。

+0

對於初學者來說,你應該使用類似'的std :: VECTOR'會拋出一個容易看到異常(否則拯救你管理內存)要出界的時候(如果你使用'在()') 。其次,你應該能夠在x和y上設置一個變量監視,看看它們是如何變化的,並查看它們何時失效,如果確實如此的話。 – chris

回答

5

基本上,回溯是導致碰撞的呼叫的追蹤。在這種情況下:

game::play稱爲game::make_computer_move呼籲Checkers::make_move呼籲Space::setPosition墜毀在第44行的文件space.h

看看這個回溯,它看起來像你通過-65-49Space::setPosition,如果他們碰巧是無效的座標(肯定看起來我是負面的和所有可疑)。然後你應該看看調用函數,看看爲什麼他們有他們所做的價值觀並糾正它們。

我會建議在代碼中自由使用assert以強制執行合約,幾乎任何時候你可以說「這個參數或變量應該只有符合某些標準的值」,那麼你應該斷言是這樣。

一個常見的例子是,如果我有一個函數,它接受這是不允許被NULL指針(或更可能的智能指針)。我將獲得函數assert(p);的第一行。如果一個NULL指針被傳遞,我立即知道並且可以調查。

最後,運行在gdb的應用中,當它崩潰。鍵入up檢查調用堆棧幀,並查看變量的外觀如何:(您通常可以在控制檯中寫入諸如print x之類的內容)。同樣,如果您需要,down也會向下移動調用堆棧。

至於SEGFAULT,我會建議在valgrind運行應用程序。如果您使用調試信息-g進行編譯,那麼它通常會告訴您導致錯誤的代碼行(並且甚至可以捕獲由於不幸原因而不會立即崩潰的錯誤)。

+0

現在唯一的問題是發現它們何時變成(-65,-49)。這是一個可變手錶的好處。 – chris

+0

雖然沒有必要崩潰... – 2012-06-02 03:14:47

+0

是的,這似乎是問題所在。我不知道他們在何處或如何變成-65,-49,但我想我所能做的就是繼續尋找。 – user1405177