gdb奇怪的行为([next]在块代码上跳回几行)

时间:2012-08-31 07:03:06

标签: c++ gdb

在调试直接的代码块时,我注意到了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 个答案:

答案 0 :(得分:5)

编译器很可能重新排列代码。我认为“新”订单仍能正常运作?

如果可能,请尝试在关闭优化的情况下进行调试;这增加了可执行文件更接近源代码的可能性。