-
Notifications
You must be signed in to change notification settings - Fork 13
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
無限ループ発生時にKGPが正常に終了しない #392
Comments
1つ以上のVariantでテストタイムアウト(無限ループによるものかどうかは不明) KGPMain自体は正しく最後まで到達しているが,謎のスレッドが残ってる? JUnitCoreが怪しい. |
いろいろ足掻いてみたが対処がわからん. 前向きな修正
後ろ向きな修正Thread頑張る |
まとはずれかもしれませんが,TestExecutor.javaのL35,executor.shutdown() を executor.shutdownNow() に変更してみるとか. |
↑試してみましたがダメっぽいです. |
Eclipse上では再現しない.なので現状のテストが正しく動いている. |
テストできないので,CUIでの再現手順をメモ. 5世代目辺りで正解バリアントを見つけるが,そのまま停止する. $ gradle assemble; java -jar build/libs/kGenProg.jar \
-r example/GCD01/ \
-s example/GCD01/src/example/GreatestCommonDivider.java \
-t example/GCD01/src/example/GreatestCommonDividerTest.java \
--random-seed 2 \
--test-time-limit 1 |
この試みるというのが問題で、Thread.interruptが呼び出されるだけのようです。 スレッドを強制的に停止される方法として、Thread.stopがあるようですが、現在は非推奨になっています。 JUnitのTimeoutでどう実装されているか見てみました。 ThreadGroup.destroyが呼び出されていますが、このメソッドはグループ内にあるすべてのスレッドが既に終了していなければdestroyされないようです。 実際に、#408 のブランチでrequired-solutionsを大きめで実行すると、以下の画像のように大量のスレッドが生成されていました。 JavaのThreadを安全に強制終了させることは難しく、Processとして切り出す必要があるのかもしれません |
以下のWebページを見つけました. 「Javaで無限ループで暴走したスレッドを外部から強制停止できないか実験したメモ」https://qiita.com/msakamoto_sf/items/919c6ee38f0c8d260566 |
以下のページに一応の解決策は載っています. 「THI05-J. スレッドの強制終了にThread.stop()メソッドを使用しない」 |
同じような解決策,JDK1.5のページにも載っていますね. |
先程の議論のメモ A. プロセス化スレッド化するから止めれないので,プロセス化する. より前向きなやり方: B. JDB監視員を用意するKGP起動時に別プロセスで監視員を作る. C. 題材側を書き換える無限ループを発生しうる箇所全てにinterrupted時の処理を加える |
D. JUnit.jarを修正するhttps://github.com/junit-team/junit4/blob/10a863eee43c9e13d1647675016b086f527a0697/src/main/java/org/junit/internal/runners/statements/FailOnTimeout.java#L139-L143 結果:Dで解決 |
JUnit4のアノテーションベースの書き方なら上記Dで解決している. しかしJUnit3の継承ベースの書き方だと上記Dでは解決しない. MathはJUnit3なのでやっかい. |
JUnitの
|
上記では停止しない問題が再発したので, ひとまずこれで実験は回るようになった. まともな修正方法は要検討. |
CUI実行で発生.
CPU回ってるので無限ループしているっぽい?
The text was updated successfully, but these errors were encountered: