web-dev-qa-db-ja.com

Visual Studioでデバッグ中に戻る前に戻り値を見つけることはできますか?

次の機能を実行します。

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

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

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

363
doekman

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

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

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


VS2015の更新:ブー!残念ながら、VS2015(devenv v14)にはないようです。
VS2017の更新:戻ってきました。 (devenv v15)

250
Marc Gravell

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

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

58
Alex Angas

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

これを使用すると、HUD表示のように、コードエディターでメソッドの戻り値を表示できます。

Statement Visualization

詳細については、 このビデオ を参照してください。

24
Omer Raviv

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

ネイティブC++またはVB6コードのデバッグの経験がある人のために、Autosウィンドウで関数の戻り値が提供される機能を使用した可能性があります。残念ながら、この機能はマネージコードには存在しません。戻り値をローカル変数に割り当てることでこの問題を回避できますが、コードの変更が必要になるため、それほど便利ではありません。マネージコードでは、ステップオーバーした関数の戻り値を決定するのは非常に困難です。ここでは一貫して正しいことを行うことができないことに気づいたため、デバッガで誤った結果を表示するのではなく、機能を削除しました。ただし、これをお客様に提供したいと考えており、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

22
Dan Solovay

Visual Studio 2015について:

Marc Gravellが現在受け入れている回答によると:

この 機能がVisual Studio 2013に追加されました 。 autosウィンドウで戻り値を確認するか、watch/immediateウィンドウで$ ReturnValueを使用できます

その答えは、この機能はVisual Studio 2015では機能しないとも述べています。これは(完全に)真実ではありません。 Onメソッド呼び出しの戻り値を調べるには、次の注意事項があります。

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

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

  • レガシー式エバリュエーターがオフの場合:only$ ReturnValue1は機能します
  • レガシー式エバリュエーターがオンの場合:both$ ReturnValueand$ ReturnValue1work
19
PascalK

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

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

これは、現在のメソッドの戻り値を示しているのではなく、現在のメソッドで呼び出された最後のメソッドの戻り値を示しているだけです。

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

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

someTableAdapter.getSomeData()の戻り値を示しているため。

ただし:

int go(){return 100 * 99;}
13
Ross Buggins

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

12
ColinM

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

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

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

7

多くの回避策がありますが、満足できるものはありません。

以下のジョン・スキートを引用するには(今削除された回答についてのコメント):

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

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

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

したがって、これはVisual Studioの機能要求であると考えてください。

5
doekman

Microsoft Visual C++はこれを実行していましたが、Visual Studioは知りません。

2
Sprintstar

PascalK's answer Visual Studio 2015でこれを機能させるために拡張したかったのは、に文書化されていない隠し機能があるためです return returnメソッド呼び出しの値

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

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

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

someTableAdapter.getSomeData();

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

2

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

1
Biri

受け入れられた回答 はVisual Studio 2015では正常に機能しませんが、メソッドの最後の行にブレークポイントを配置し、 F10、戻り値のすべての式をローカルウィンドウに配置します。

1

[デバッグ]→[自動]ウィンドウを開くと、閉じられます。実際の戻り値は表示されませんが、returnステートメントで評価されたものが表示されます。

1
GeekyMonkey

ええ、VB.NETに切り替えて。 ; P(「Visual Studio」と言っただけです。;)

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

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

その小さなVB.NET機能(および有効にするExit Functionステートメント-別の機能C#にはないため、そうする必要があります)は、 defensive programming という形で非常に便利です。最初のステートメントとして、関数名を失敗/デフォルト値に初期化します。次に、任意の障害ポイント(通常は成功ポイントよりもはるかに頻繁に発生します)で、Exit Functionステートメントを呼び出すことができます(つまり、障害/デフォルト式または定数/変数名を複製する必要はありません)。

1
Tom

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

1
Joe Rattz

"someTableAdapter.getSomeData();"を選択して右クリックし、Quick Watchを選択してみてください。

0
Yann Semet