在调试直接的代码块时,我注意到了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。
答案 0 :(得分:5)
编译器很可能重新排列代码。我认为“新”订单仍能正常运作?
如果可能,请尝试在关闭优化的情况下进行调试;这增加了可执行文件更接近源代码的可能性。