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)

これらの行を2回実行する理由はまったくありません。私はこの振る舞いを理解していません。コードは次のようになります。

(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実行中のスレッドは1つだけであると言います。また、すべてが適切な結果をもたらすように見えますが、2回実行しても、ほとんどが単純なセッターであるため、問題はありません。

誰かがこのようなものを見た、またはどこで調査するためのヒントがありましたか?私は自分で失敗しました=)。

ヒントをありがとう、luk32。

4

1 に答える 1

5

ほとんどの場合、コンパイラはコードを再配置します。「新しい」注文はまだ正しく機能すると思いますか?

可能であれば、最適化をオフにしてデバッグしてみてください。これにより、実行可能ファイルがソースコードの近くにとどまる可能性が高くなります。

于 2012-08-31T08:04:58.173 に答える