先ほど書いたGoogle App EngineをEclipseプラグインで実行している時に
デバックモードで実行してもブレークポイントで止まらないという件。
ブレークポイントで止まらない
なんかまとめてたらPCから変なエラー出て止まったので予備PCで再度まとめorz
色々調べてみたところJDK1.6.0_14で問題があったみたい。
アップデートリリースノート
↑のデバッグの問題を参照
☆以下引用☆
デバッグの問題
Java "! Virtual Machine Tool Interface (JVM TI) のブレークポイントは、並列スカベンジガベージコレクタ (-XX:+UseParallelGC) または並列圧縮ガベージコレクタ (-XX:+UseParallelOldGC) が使用されている場合のみ信頼できます。
ほかのコレクタが使用されている場合は、ブレークポイントが機能しなくなることがあり、フル GC 処理の実行後に JVM TI オブジェクトタグが使用不可になることがあります。Java "! Debug Interface (JDI) ThreadReference には、JVM TI オブジェクトタグに依存する埋め込みのスレッド ID があるため、この埋め込みのスレッド ID が予期せず変更されることがあります。これにより、スレッドベースの JDI イベントに混乱が発生する可能性があります。
シリアルガベージコレクタ (-XX:+UseSerialGC) はこの問題に対して脆弱ですが、一部のプラットフォームではデフォルトで選択されることに注意してください。この問題を回避するには、コマンド行オプション -XX:+UseParallelGC を使用して並列スカベンジコレクタを明示的に選択します。
☆引用ここまで☆
JDK1.6.0_16で改善されているらしい。
じゃあ、
今入れてるJDKいくつだったかな?ってなる。
今入れてるのね
JDK1.6.0_21
(´・ω・`)
一度冷静になろうか。
確か、今入れているJDKは以前JSP表示時にエラーになる問題
JasperException
のときに入れたもの。
Eclipseを立ち上げたままインストールしようとしたら怒られた気がする。
んで、
正しくインストールor設定されていなかったとしよう(前向きに捉えて)
もうこれはやるしかない。
1.Webアプリケーションを停止
2.Eclipseを閉じる
3.JDK1.6.0_21をダウンロード(ORACLE)
4.JDK1.6.0_21を再インストール
5.Eclipseをクリーンコマンドで起動(eclipse.exe -clean.cmd)
6.ブレークポイントを付ける
7.デバッグモードで実行
きた。
できちゃった。
超スッキリしたんだけど、
イライラ返せ^^;
Google App Engineも今日で何日目になるやら。
ちょっと前から気になっていた事が。
開発をしていると、思ったように動かない事がしばしばあったりする。
(まあ当然だろうけど。)
そんな時にわりとEclipseでデバッグ機能を多様する事が多いのだけど、
Google App Engineをやっていたら
…あれ?
ブレークポイント指定しても止まらない…。
で、
何故かその時は、
そんなものなのかな~
なんて気軽に構えていたけど、
よく考えたら
重 大 事 故 だよね
開発において、デバッグができないとしたら
ありえないありえない。
エラーログも出ないようなロジックミスだとしたら
90000%分らないじゃんorz
ましてや、GAEの環境を使う事なんて
今 回 が 初 め て なんだし。
まあ、
率直に言っちゃうと
そろそろデバッグなしで開発進めるのは限界なんだよと
(何故今までしなかったかは置いといて…w)
よし、調べよう。
でないとイライラが止まらない。
ちょっと前から気になっていた事が。
開発をしていると、思ったように動かない事がしばしばあったりする。
(まあ当然だろうけど。)
そんな時にわりとEclipseでデバッグ機能を多様する事が多いのだけど、
Google App Engineをやっていたら
…あれ?
ブレークポイント指定しても止まらない…。
で、
何故かその時は、
そんなものなのかな~
なんて気軽に構えていたけど、
よく考えたら
重 大 事 故 だよね
開発において、デバッグができないとしたら
ありえないありえない。
エラーログも出ないようなロジックミスだとしたら
90000%分らないじゃんorz
ましてや、GAEの環境を使う事なんて
今 回 が 初 め て なんだし。
まあ、
率直に言っちゃうと
そろそろデバッグなしで開発進めるのは限界なんだよと
(何故今までしなかったかは置いといて…w)
よし、調べよう。
でないとイライラが止まらない。
Google App Engineで以下のクエリを実行する。
Query query = pm.newQuery(TestDto.class);
List<TestDto> testDtoList = (List<TestDto>) query.execute();
この直後、
取得したtestDtoListのリストに、
適当にnewしたオブジェクトを追加
TestDto testDto = new TestDto();
testDtoList.add(testDto);
しようとすると
java.lang.UnsupportedOperationException: Query result sets are not modifiable
となる。
例外から読み取ると、
クエリの結果で得たtestDtoListは参照渡しで生成されているため、
参照元のオブジェクトに影響が出る事は出来ない模様。
ただ↑の事象はわりと特殊なだけで、多分GAEが…というわけではなく、
Javaの規則によるものだと思われる。
例えば、
String[] strHairetu = {"aaa","bbb","ccc"};
List strList = Arrays.asList(strHairetu);
とあった時、
strList.add("ddd");
とすると、strListの変更はstrHairetuの配列にも反映されようとするが
strHairetuは配列のため、要素を増やす事が出来ず、
UnsupportedOperationException
が発生する。
要は、Google App Engineのデータストアも、
なんらかしらの理由で取得する際の要素数が固定化されているんじゃないかと。
勿論憶測ね。
…うん。今度調べるよorz
Query query = pm.newQuery(TestDto.class);
List<TestDto> testDtoList = (List<TestDto>) query.execute();
この直後、
取得したtestDtoListのリストに、
適当にnewしたオブジェクトを追加
TestDto testDto = new TestDto();
testDtoList.add(testDto);
しようとすると
java.lang.UnsupportedOperationException: Query result sets are not modifiable
となる。
例外から読み取ると、
クエリの結果で得たtestDtoListは参照渡しで生成されているため、
参照元のオブジェクトに影響が出る事は出来ない模様。
ただ↑の事象はわりと特殊なだけで、多分GAEが…というわけではなく、
Javaの規則によるものだと思われる。
例えば、
String[] strHairetu = {"aaa","bbb","ccc"};
List strList = Arrays.asList(strHairetu);
とあった時、
strList.add("ddd");
とすると、strListの変更はstrHairetuの配列にも反映されようとするが
strHairetuは配列のため、要素を増やす事が出来ず、
UnsupportedOperationException
が発生する。
要は、Google App Engineのデータストアも、
なんらかしらの理由で取得する際の要素数が固定化されているんじゃないかと。
勿論憶測ね。
…うん。今度調べるよorz