是否可以在Visual Studio调试器中获取方法的返回值,即使该值未分配给局部变量?例如,我正在调试以下代码:
public string Foo(int valueIn)
{
if (valueIn > 100)
return Proxy.Bar(valueIn);
else
return "Not enough";
}
因为我没有在Foo中设置任何局部变量,并假设我没有在任何调用Foo中设置断点,如果我在Foo中有一个断点,有没有办法看看返回值是什么(或另一种方式)?我对Autos或Intermediate窗口没有多少经验,所以我不确定这些是否是有效选项。
答案 0 :(得分:6)
您可以在Foo中设置断点,打开即时窗口并运行以下命令:
? Foo(valueIn)
这将在立即窗口中打印返回值。
您也可以复制表达式并将其粘贴到Watch窗口中,但只有在我确定该调用没有副作用时才会这样做(否则您会得到令人困惑的结果)。
答案 1 :(得分:5)
您始终可以切换到反汇编视图并逐步执行各个指令。在您执行'ret'指令之前,返回值将在@eax(或@rax)中。
答案 2 :(得分:2)
不,我不知道如何做到这一点。我会在调用者中放置一个断点并查看那里的返回值。
答案 3 :(得分:2)
您还可以在调试器中突出显示任何表达式,然后右键单击 - >快速观看。这将执行表达式(假设它是有效的)并给你值。
答案 4 :(得分:1)
Visual Studio 2013现在可以在Autos窗口中显示函数返回的最后一个值,从而减少在Output窗口中重新执行它或引入临时变量的需要:
答案 5 :(得分:0)
您始终可以使用手表框评估功能调用。
美孚(valueIn);
这仅在您的Proxy.Bar(valueIn)与时间无关时才有效。
答案 6 :(得分:0)
解决方法是使用Pascal样式的结果变量:
public string Foo(int valueIn)
{
string result;
if (valueIn > 100)
result = Proxy.Bar(valueIn);
else
result = "Not enough";
return result;
}
对于更长的功能,我认为这是一种很好的风格。对于像上面这样的非常短的它可能被认为是矫枉过正,但它确实解决了调试器问题。
答案 7 :(得分:0)
类似问题的答案: 在VS 2013中,您可以将变量$ ReturnValue添加到手表中。它包含函数的实际返回值。
归功于Jesper Jensen。