在VS调试器中获取方法的返回值

是否可以在Visual Studio调试器中获取方法的返回值,即使该值未分配给局部变量? 例如,我正在调试以下代码:

public string Foo(int valueIn) { if (valueIn > 100) return Proxy.Bar(valueIn); else return "Not enough"; } 

因为我没有在Foo中设置任何局部变量,并且假设我没有在任何调用Foo中设置断点,有没有办法看到返回值是什么,如果我在Foo内部有一个断点(或另一种方式) )? 我对Autos或Intermediate窗口没有多少经验,所以我不确定这些是否是有效选项。

您可以在Foo中设置断点,打开即时窗口并运行以下命令:

 ? Foo(valueIn) 

这将在立即窗口中打印返回值。

您也可以复制表达式并将其粘贴到Watch窗口中,但只有在我确定该调用没有副作用时才会这样做(否则您会得到令人困惑的结果)。

您始终可以切换到反汇编视图并逐步执行各个指令。 在执行’ret’指令之前,返回值将在@eax(或@rax)中。

不,我不知道有办法做到这一点。 我会在调用者中放置一个断点并查看返回值。

您还可以在调试器中突出显示任何表达式,然后右键单击 – >快速监视。 这将执行表达式(假设它是有效的)并给你值。

Visual Studio 2013现在可以在“自动”窗口中显示函数返回的最后一个值,从而减少在“输出”窗口中重新执行它或引入临时变量的需要:

http://blogs.msdn.com/b/visualstudioalm/archive/2013/06/27/seeing-function-return-values-in-the-debugger-in-visual-studio-2013.aspx

您始终可以使用您的手表盒来评估function调用。

FOO(valueIn);

这仅在您的Proxy.Bar(valueIn)与时间无关时才有效。

解决方法是使用Pascal样式的结果变量:

 public string Foo(int valueIn) { string result; if (valueIn > 100) result = Proxy.Bar(valueIn); else result = "Not enough"; return result; } 

对于更长的function,我认为这是一种很好的风格。 对于像上面这样的非常短的它可能被认为是矫枉过正,但它确实解决了调试器问题。

类似问题的答案:在VS 2013中,您可以将变量$ ReturnValue添加到手表中。 它包含函数的实际返回值。

感谢Jesper Jensen。