2012-08-31 36 views
3

當調試一個直接的代碼塊時,我注意到gdb的漂亮bahaviour。 我用以下命令正常運行gdb。gdb奇怪的行爲([下一個]在塊代碼上跳回幾行)

gdb ./exe 
break main 
run 
next 

然後[enter]幾次。 我有什麼作爲的結果是

35  world.generations(generations); 
(gdb) 
36  world.popSize(100); 
(gdb) 
37  world.eliteSize(5); 
(gdb) 
41  world.setEvaluationFnc(eval); 
(gdb) 
37  world.eliteSize(5); 
(gdb) 
39  world.pXOver(0.9); 
(gdb) 
38  world.pMut(0.9); 
(gdb) 
41  world.setEvaluationFnc(eval); 
(gdb) 

是絕對沒有理由在這些線路上運行兩次。我不明白這種行爲。代碼如下:

(gdb) list 39 
34  SimpleGA<MySpecimen> world; 
35  world.generations(generations); 
36  world.popSize(100); 
37  world.eliteSize(5); 
38  world.pMut(0.9); 
39  world.pXOver(0.9); 
40 
41  world.setEvaluationFnc(eval); 
42 
43  world.setErrorSink(stderrSink); 

我不確定我是否應該無視它或在我的代碼中有什麼邪惡的事情發生。該應用程序使用OpenMP並進行編譯以使用它。但是,info thread表示只有一個線程正在運行。此外,一切似乎都能給出適當的結果,但即使執行兩次也不會有任何問題,因爲這些大多數是簡單的制定者。

有沒有人看過類似的東西或有任何提示調查?我自己失敗=)。

感謝提示, luk32。

+1

您是否在開啓任何優化的情況下進行編譯?你確定你在上次編譯後沒有修改源代碼(gdb提取實際的源代碼)? –

回答

5

最有可能的是編譯器重新安排代碼。我想「新」訂單仍然正常工作?

如果可能,請嘗試在優化關閉的情況下進行調試;這增加了可執行文件保持接近源代碼的可能性。

+0

好的。這是對的。 @Joachim是第一,但他只評論說,所以我接受這一個。不知道我是否可以獎勵他。爲什麼我沒有想到它。 gnu的O3是原因。 O0解決了這個問題。它看起來非常bizare哈哈。謝謝你兩個快速的建議! – luk32