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


387

次の関数を取ります:

DataTable go() {
    return someTableAdapter.getSomeData();
}

この関数にブレークポイントを設定すると、戻り値を検査できますか?ページgo()内のデータグリッドに直接結合されてい.aspxます。

返されたデータテーブルを検査する唯一の方法は、一時変数を使用することです。しかし、それは少し不便です。別の方法はありませんか?


1
コールスタックを上に戻ると、時計を追加できます
Chris S

以前はVB6でこれを行うことができたと記憶しています。しかし、当時の関数の構文には、関数の値を戻り値に設定することが含まれていました...
Neil Barnwell

5
Visual C ++ユーザーへのコメント:イミディエイトウィンドウまたはウォッチウィンドウに「$ ReturnValue」と入力します。少なくとも私のVS 2010では、うまくいきました!
sergiol 2013

9
VS2015の場合は、$ ReturnValue1を使用します。以下の20の回答と100のコメントを読みたくない場合は、!
felickz

3
このすべてに対する2019年の答えは何ですか?これらの回答は非常に古いものです。
dylanh724

回答:


264

私が知っていることではありません。あなたがあればという注意ください変数を追加し、それはリリースでは、コンパイラによって削除されますが、とにかくビルドします...

更新: この機能はVS2013に追加されました。autosウィンドウで戻り値を確認したり$ReturnValue、watch / immediateウィンドウで使用したりできます。

値は関数から戻った直後にのみ表示されるため、関数呼び出しにブレークポイントを設定し、呼び出しをステップオーバー(F10)することにより、値にアクセスする最も簡単な方法です。


VS2015の更新:ブー!残念ながら、VS2015(devenv v14)のVS2017の
アップデートには含まれていないようです。(devenv v15)


12
一時を忘れる理由は、読みやすさとスタイルであり、効率ではありませんか?
orip 10/07/26

8
これは、VS 2010からのIntelliTraceで可能です:blogs.msdn.com/b/habibh/archive/2009/10/23/...
ダニエルHilgarth

2
Intellitraceは、VS Ultimate Editionでのみ使用できます。
JMGH 2014年

3
@MarcGravellあなたの答えは間違っています!確かに、返信からMSがVS13でその機能をリリースするまでに6年かかりましたが、それでもまだです。あなただけ「を追加していたと思います場合は、当分の間、免責事項として、」...(いいえ、私は遅くないよそれは。、もちろん、冗談あなたしている神のような、チームメイト。。)
コンラートViltersten

6
VS2015の@MarcGravell:$ ReturnValue1が機能します!(最終バージョンでテスト済み)
GY

58

これは、顧客フィードバックサイトによると、 CLR 4.5.1を搭載したVisual Studio 2013で実行できます。以前のバージョンのC#では使用できませんでした。

(Visual Studio 2008以前はVB.NETでサポートされていました。C/ C ++開発者は常に利用できます。)


1
Visual Studio 2010 C ++でこれをどのように行いますか?
ユーザー

Microsoft Connectは、信頼できる方法でこれを実装することを妨げるマネージコードに根本的な問題があると言います:
Dan Solovay

@DanSolovay彼らが使用する言葉は「一貫して正しいことを行うことができませんでした」(VS11の場合)ですが、「これを取り戻したい」、「この問題に対するいくつかの潜在的な解決策を検討しています」。
Alex Angas

接続エントリが古くなっています。機能は...放棄されたようです...((((
Softlion

1
これは、VS 2010からのIntelliTraceで可能です:blogs.msdn.com/b/habibh/archive/2009/10/23/...
ダニエルHilgarth

25

これは非常に役立つことであることに同意します。ステップアウトする前にメソッドの戻り値を確認するだけでなく、ステップオーバーしたばかりのメソッドの戻り値も確認します。「OzCode」と呼ばれるVisual Studioの商用拡張機能の一部として実装しました。

これを使用すると、メソッドの戻り値をコードエディターでHUDディスプレイの一種として表示できます。

ステートメントの視覚化

詳細については、こちらのビデオをご覧ください。


23

Microsoftによると、これをマネージコードで確実に実装する方法はありません。これは、彼らが認識し、取り組んでいる問題です。

ネイティブC ++またはVB6コードのデバッグの経験がある人は、[自動]ウィンドウで関数の戻り値が提供される機能を使用した可能性があります。残念ながら、この機能はマネージコードには存在しません。戻り値をローカル変数に割り当てることでこの問題を回避できますが、コードを変更する必要があるため、これはそれほど便利ではありません。マネージコードでは、ステップオーバーした関数の戻り値を判別するのは非常に困難です。ここでは一貫して正しいことを行うことができないことがわかったので、デバッガーで誤った結果を出すのではなく、機能を削除しました。ただし、これをお客様に返却したいと考えています。CLRチームとデバッガチームは、この問題の潜在的な解決策をいくつか検討しています。残念ながら、これはVisual Studio 11の一部ではありません。

https://connect.microsoft.com/VisualStudio/feedback/details/597933/add-a-return-pseudo-variable-to-the-visual-studio-debugger-for-net-code


1
上記の@Alex(stackoverflow.com/a/3714884/402949)によると、これはVS2013 for CLR 4.5で利用可能です
Dan Solovay

21

Visual Studio 2015について:

Marc Gravellが現在認めている回答によれば、

この機能はVisual Studio 2013に追加されました。autosウィンドウで戻り値を確認するか、ウォッチ/イミディエイトウィンドウで$ ReturnValueを使用できます

その回答は、この機能はVisual Studio 2015では機能しないとも述べています。これは(完全に)正しくありません。上のメソッド呼び出しの戻り値を調べ、以下の注意事項があります:

$ ReturnValueが認識されるようにするには、レガシー式エバリュエーターをオンにする必要があります(ツール/オプション/デバッグ/レガシーC#およびVB式エバリュエーターを使用)。それ以外の場合は、$ ReturnValue1を使用できます。

これをVisual Studio 2015 Enterpriseでテストしました。

  • レガシー式エバリュエーターがオフの場合:$ ReturnValue1 のみが 機能します
  • 従来の式エバリュエーターがオンになっている場合:$ ReturnValue $ ReturnValue1の両方が 機能します

3
これはもう必要ないようです。VS 2015 Update 3では、レガシーエバリュエーターを無効にして$ReturnValue機能しています。ただし、Use managed compatibility modeデバッグオプションを有効にしている場合、戻り値はどこにも表示されません。
Nick

13

メニューツールオプション、IntelliTraceに移動し、イベントと通話情報を収集するように設定を変更した場合。

前の呼び出しイベント(Ctrl+ Shift+ F11)に戻り、autosウィンドウでメソッド呼び出しから返された一時的な値をメソッド名の子として確認できます。

現在のメソッドの戻り値は表示されません。現在のメソッドで呼び出された最後のメソッドの戻り値が表示されるだけです。

だから、それは大丈夫です

DataTable go(){return someTableAdapter.getSomeData();}

これは、の戻り値を示していますsomeTableAdapter.getSomeData()

しかし、ではない:

int go(){return 100 * 99;}

12

.NET以前の時代の古いトリック:[レジスタ]ウィンドウを開き、EAXレジスタの値を確認します。これには、最後に呼び出された関数の戻り値が含まれています。


1
メタルアプローチに近いオールドスクールの+1-ただし、これはすべての戻り値に対して機能するわけではありません(JIT'erの責任です)。 )。整数型の場合、(ほとんどの場合)機能します。大きな値タイプは別の問題です(そして、私がいくつかのブログ投稿から思い出す限り、それらはVS2013にも表示されません)。
JimmiTh 2013

10

Shift-F11を使用してgo()メソッドからステップアウトすると、[Autos]デバッグウィンドウに、スタックからポップしたばかりのメソッド呼び出し(この場合、go()メソッド)の戻り値が表示されます。あなたが欲しいもの)。これはVisual Studio 2005の動作です。私はVisual Studio 2008を使用していないので、そのバージョンで同じように動作するかどうかはわかりません。


VS2005とVS2008の両方でこれを試しましたが、実際にはわかりません。「自動」ウィンドウを開いていますが、「移動」機能では、自動ウィンドウは空です。また、関数から抜け出すとき(関数の閉じ中かっこは黄色です)。ヒントをもう1つ教えてください。
doekman 2008年

go()関数の内部では、Autosウィンドウが空であると思います。関数のCOMPLETELY OUTをステップ実行する必要があります(つまり、デバッグカーソルはCALLED go()を持つ関数を指している必要があります)。そして、[Autos]ウィンドウにgo()の戻り値が表示されます。
LeopardSkinPillBoxHat 2008年

@LeopardSkinPillBoxHat:追加のヒントがあっても、これを機能させることはできません。Visual Basicでこれを試していますか?戻り値の監視と変更に対するサポートが向上しているようです...
Roman Starkov

@romkyns-「自動」ウィンドウに何が表示されますか?最後に呼び出された関数が何を返したかを示す線が表示されていませんか?
LeopardSkinPillBoxHat 2009年

2
@LeopardSkinPillBoxHat:いいえ、C#ではそれを行いません。PSうわー、これをもう一度見るのにしばらく時間がかかりました。
ローマン・スターコフ2010

7

はい、とても良い方法があります。重要な欠点の1つは、5年、おそらく6年待たなければならないことです。あなたが2008年11月に投稿したことを知っているので、あなたはwaaaaaa ...

...そう。そして、ほら!ちょうどあなたのために、MSは最新のVisual Studio 2013をリリースしました。これは、デバッグモード(メニューDebugWindowsAutos)で実行中にメニューからアクセスできるデフォルトの機能です。


@Doug 2008年11月に質問があり、私の回答が2014年9月に届いたため。元の投稿者はおそらく満足しており、クレジットを移動したくありません。しかし、私はあなたに同意します-私の答えにもう少しの騒ぎを気にしません。私はupsiesとrep gainが好きです。:)
Konrad Viltersten 2017

今日この問題がありました。最初の問題は2008年でしたが、2014年に返信いただきありがとうございます。あなたの答えは私が探していたものです。
AP

@AP問題ありません。この投稿を見ると、タイムマシンのように感じます。過去からの爆風、へへ。
Konrad Viltersten

5

多くの回避策がありますが、どれも満足できるようには見えません。

以下のJohn Skeetを引用するには(削除された回答についてコメント):

それでも私には不便に見えます-特にデバッグを開始する前に必要な戻り値がわからない場合。何かを返すたびに一時的な変数がコードを乱雑にする必要はありません。

理論的には、デバッガーは- return変数を持つことができます。結局のところ、それはスタック上の単なる変数です:

unsafe {
  int * sp = stackalloc int[1];
  try {
    return a+b;
  }
  finally {
    Trace.WriteLine("return is " + *(sp+3));
  }
}

したがって、これをVisual Studioの機能要求と見なしてください。


変数(明確に定義されたローカル)とスタックの値の間にはかなり大きな違いがあります。これはスタック上の値ですが、変数(= local)ではありません。
Marc Gravell

@Marc:CLRがどのように機能するかはわかりませんが、多くのコンパイラーは関数引数をスタックポインター(sp)の下のスタックに配置し、ローカル変数をスタックポインターの上に配置します。それは私が見せようとしていることです。そして、戻り値が参照型の場合、ポインタ値を取得するだけです。
doekman 2011年

1
必ずしもスタック上にあるとは限りません。実際、
Debug-

5

これをVisual Studio 2015で機能させるためのPascalKの答えさらに詳しく説明したいと思いますメソッド呼び出しの戻り値を調べるに記載されていない隠し機能があるためです。

ネストされた関数呼び出しがある場合、疑似変数$ResultValueXが自動的に作成されます。Xは関数呼び出しの順序を示します。したがって、などの呼び出しがある場合Multiply(Five(), Six())、次の疑似変数が作成されます。

Five()     | $ResultValue1 = 5
Six()      | $ResultValue2 = 6
Multiply() | $ResultValue3 = 30


2

私が知っている唯一の方法は、戻り行にブレークポイントを配置してから、Quick Watchウィンドウを呼び出して、返された式を入力することです。

someTableAdapter.getSomeData();

ただし、これが機能するのは、呼び出しがオブジェクトの状態を変更しない場合のみです(実行を再開するときに同じメソッドへの2番目の呼び出しがあるため)。


5
これは、式にラムダがない場合にのみ機能します。
ローマスターコフ2009年

1

フラグやその他の変数を設定せず、何かを返すだけの場合は、中間ウィンドウでも値を評価するよう要求できます。


私は時々イミディエイトウィンドウも使用するため、質問にラムダを含める必要があります
Chris S

1

これは、[レジスタ]ウィンドウ(デバッグ/ウィンドウ/レジスタ)でRAXレジスタを確認することで判断できると思います。関数のステップアウト(SHIFT + F11)の後、RAXレジスタを確認します。事実はわかりませんが、月に一度、レジスター(.NET以前)をチェックして、戻り値を確認できます。RAXとRBXの組み合わせなどになることもあります。


1

Debug→Autosウィンドウを開くと閉じます。実際の戻り値は表示されませんが、returnステートメントで評価された値が表示されます。


2
そのような何かを表示するVS2008自動ウィンドウを取得できませんでした。明確にしていただけませんか?
ローマスターコフ2009年

return x + y; この行にブレークポイントを設定すると、Debug-Autosウィンドウにxとyの現在の値が表示されます。私が言ったように、それはあなたを閉じるだけです。ただ役立つようにしようとしています。それは反対票に値するとは思わない。
GeekyMonkey

1

ええ、VB.NETに切り替えることで。; P( "Visual Studio"とだけ言いました。;)

私が覚えている限り(Visual BasicからVB.NETのすべてのバージョンまで)、関数名をクエリするだけです。これは、関数の先頭で暗黙的に宣言されたローカル変数のように「機能」し、その現在の値は、関数が非戻りステートメントを介して終了するとき(つまり、Exit Functionまたは単に通過するとき)に、もちろん、戻り値としても使用されます。returnステートメントが使用されます。

また、returnステートメントの式にも設定されます。ローカル変数と同様に、その値は関数内の任意の実行ポイント(returnステートメントの実行後を含む)で検査できます。C#にはこれがなく、必要です。

その小さなVB.NET機能(およびExit Functionそれが有効にするステートメント-別の機能にはC#にはない機能と必要な機能)は、関数型名を常にエラー/デフォルト値に初期化する防御的プログラミングの形式で非常に役立ちます。最初のステートメント。次に、失敗ポイント(通常、成功ポイントよりもはるかに頻繁に発生します)で、Exit Functionステートメントを呼び出すだけです(つまり、失敗/デフォルトの式や定数/変数名を複製する必要はありません)。



0

を選択"someTableAdapter.getSomeData();"して右クリックし、クイックウォッチに進むことができます。


-1

戻り式をウォッチウィンドウにドラッグアンドドロップします。

たとえば、ステートメントで

return someTableAdapter.getSomeData();

ドラッグアンドドロップ

someTableAdapter.getSomeData()

ウォッチウィンドウに入ると、値が表示されます。

これは、任意の式に対して実行できます。


2
その問題:式が2回評価されます。
doekman

6
また、ウォッチ式にはラムダ式を含めることはできません。ラムダ式はかなり使用します。
スティーブクレーン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.