Eclipseでデバッグ中に戻る前に戻り値を確認できますか?


99

行が実行された後、命令ポインターが呼び出し元の関数に戻る前に、メソッドの戻り値を確認できますか?

私は変更できないコードをデバッグしています(読み取り:サードパーティのライブラリを再コンパイルしないでください)。ソースがないコードにジャンプしたり、return式に副作用があるため、[ 表示 ]タブで式を実行するだけです。

多くの場合、戻り値は複合ステートメントで使用されるため、変数ビューには値が表示されません(したがって、制御が呼び出し元の関数に戻る前に結果を確認したい)。

更新:ステートメントに副作用があるため、式ビューアを使用できません。


7
それが私がIntelliJのコミュニティバージョンに切り替えた理由です。Eclipseの人々は、これがどれほど重要であるかを理解していないようです。(修正された場合は、リリースされた日に切り替えます。)

@James Mitchellこれはプラグインにとって素晴らしいアイデアのようです。私はそれを自分のToDoリストに追加し、時間を見つけたら(すぐにはではありません)
IAdapter

@ user672348しかし、IntelliJ IDEAでそれを行う方法は?
Alexey Tigarev 2013

@AlexeyTigarev:IIRC、「Step Return」(または同等のもの)を実行すると表示されます。
Blaisorblade、2014

1
Eclipse Oxygen(2017年リリース日中旬)をご利用ください。M2マイルストーンにはこの機能が含まれています
Abdull

回答:


35

この機能は、Eclipseバグ40912Eclipseバージョン4.7 M2に追加されました。

それを使用するには:

  • returnステートメントをステップオーバーする(「ステップオーバー」または「ステップリターン」を使用)
  • これで、変数ビューの最初の行に、 "[statement xxx] returned:"のように、returnステートメントの結果が表示されます。

詳細については、Eclipse Project Oxygen(4.7)M2-New and Noteworthyを参照してください。


私も。Eclipseを使用しているときにこの機能を見逃しています。
m24p '15

1
このEclipseのバグは、その後2009年後半に再開されました。ただし、まだ誰も割り当てられておらず、ターゲットマイルストーンもないため、まだ修正を待っています。:)
マークA.フィッツジェラルド

1
これは、Eclipse 4.7(M2以降)の最近のビルドで修正されています
AbdullahC

1
修正の使用方法に関するいくつかの情報は、4.7 M2の新機能および注目すべき機能に記載されています。ここで「ステップ操作後のメソッド結果」を探してください:eclipse.org/eclipse/news/4.7/M2
Joshua Goldberg

@JoshuaGoldberg:これを指摘してくれてありがとう-私はそれを回答に編集しました。
sleske

34

このための本当に良いショートカットを見つけました。値を返す式を選択して押します

Ctrl + Shift + D

これにより、returnステートメントの値が表示されます。これは、デバッグのためだけに変更できない、または変更したくない場合に非常に役立ちます。

お役に立てれば。

注:これをサードパーティのライブラリでテストしていませんが、私のコードでは問題なく動作しています。これをWeb開発者向けのEclipse Java EE IDEでテストしました。バージョン:Juno Service Release 1


4
+1。これは戻り値だけでなく、式全体にも機能するためです。[式]タブを使用するよりもはるかに便利です。これはコードを実行するため、副作用がある場合は注意してください。help.eclipse.org/indigo/…–
ヤギ

1
Ctrl + Shift + I私にとっても役に立ちました。
Ciro Santilli郝海东冠状病六四事件法轮功

2
@goatが述べたように、これはコードを複数回実行するため、たとえば、関数がthisを実行した場合、return System.currentTimeMillis();実際に返された関数とは異なる結果が得られます。
Brad Parks

上の等価Apple machine
Adrien Be

これは問題のあるアドバイスです。これは式を再評価するため、副作用があると悲惨な結果になる可能性があります。
sleske


5

そのため、私は常に次のパターンのメソッドを使用します。

MyReturnedType foo() {
     MyReturnedType   result = null;

     // do your stuff, modify the result or not

     return result;
}

私のルール:

  1. メソッドの最後にのみreturnステートメントを1つだけ(最後に許可)
  2. デフォルトから開始して、常に、戻り値を保持するローカルの呼び出された結果を保持します。

当然、最も簡単なゲッターは免除されます。


3
ちょっとzvikico-私が自分のコードで作業しているとき、私は通常、同様のパターンを使用します。残念ながら、私の問題は、自分が記述し​​たり自分が変更したりできないコードを使用している場合です。:S
ロデオクラウン2008年

今、私はequivocatingています....私もこれを行うが、SonarLintが不平を言っている: stackoverflow.com/questions/31733811/...
HDave

@WitoldKaczurbaそれはあなたの意見であり、それは結構です。他の意見があることを受け入れ、そうする人に敬意を表してください。
zvikico

こんにちはzvikco。メッセージをありがとう。さまざまなアプローチがあることを受け入れますが、pmd.sourceforge.io / pmd-4.3.0 / rules /…を参照しました。乾杯
Witold Kaczurba

2

この質問の答えも知りたいです。

以前は、そのようなサードパーティのライブラリを扱うときに、親クラスに委譲するラッパークラスまたは子クラスを作成し、ラッパー/子クラスでデバッグを行っていました。ただし、追加の作業が必要です。


1
このソリューションの問題(追加の作業についてメモしたものを除く)は、外部ライブラリの内部に複数のクラス/メソッドがない場合にのみ機能することです。ただし、メソッドの外側のレイヤーを扱う場合に役立ちます。
ロデオクラウン2008年


0

難しいもの。私のEclipse以外の経験では、戻り値を確認する必要がある場合は、関数のローカル変数に割り当てることをお勧めします。これにより、returnステートメントは単純return varname;でなくになりreturn(some * expression || other);ます。ただし、コードを変更または再コンパイルすることはできない(またはしたくない)と言っているので、それは恐ろしく役に立ちません。だから、私はあなたに良い答えはありません-おそらくあなたはあなたの要件を再検討する必要があるでしょう。


私のコードでは、結果を確認できるように一般的に中間ステップがありますが、使用しているコードの一部には、組織のオーバーヘッドが大きすぎて変更できません(特に、ライブラリが更新された場合、フォークバージョンを維持したくない場合)デバッグ用)。
ロデオクラウン2008年

0

returnステートメントに応じて、返されている式を強調表示できます。右クリックメニューから、「式を評価する」のようなものが表示されます(現在、目の前に日食はありませんが、そのようなものです。 )。何が返されるかが表示されます。


4
問題は、戻り機能の評価に副作用(たとえば、データベースエントリが作成されるなど)がある場合、戻り式を評価するとシステムの状態が変化することです。しかし提案をありがとう。
ロデオクラウン2008年

0

これは少し遠方ですが、簡単な方法がないようです:

AspectJを使用して、関心のあるメソッドの戻り値を取得するアスペクトを持つJARを計測できます。Eclipseのドキュメントによると、AspectJプログラムは他のプログラムと同様にデバッグできます

ライブラリを再コンパイルせずにクラスを作成するには、2つのオプションがあります。

  • バイナリJARの処理が許容できる場合は、コンパイル後のウィービング。

  • 読み込み時のウィービング。VMでウィービングエージェントをアクティブ化する必要があります。

Eclipseのドキュメント(上記のリンク)とAspectJ開発環境ガイドも参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.