3

在调试直接代码块时,我注意到 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。

4

1 回答 1

5

很可能是编译器重新排列了代码。我想“新”命令仍然可以正常工作?

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

于 2012-08-31T08:04:58.173 回答