【问题标题】:Getting a Method's Return Value in the VS Debugger在 VS 调试器中获取方法的返回值
【发布时间】:2009-11-09 22:11:10
【问题描述】:

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

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

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

【问题讨论】:

标签: c# visual-studio debugging


【解决方案1】:

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

? Foo(valueIn)

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

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

【讨论】:

  • 这会再次执行该函数,这不一定是个好主意。
  • 在快速查看窗口或即时窗口中使用$ReturnValue Visual Studio 调试器变量要好得多,而且没有风险。看看here
【解决方案2】:

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

【讨论】:

  • ...或者在那之后!例如。按F10/Shift-F11/光标返回父函数。这在返回值类型时很好。问题是,该值可能是一个指针,如果没有解除引用,它就没有用了。
【解决方案3】:

类似问题的答案: 从 Visual Studio 2013 开始,您可以将变量 $ReturnValue 添加到监视列表中。它包含函数的实际返回值。

感谢 Jesper Jensen。

【讨论】:

    【解决方案4】:

    不,我不知道有什么方法可以做到这一点。我会在调用者中放置一个断点并查看那里的返回值。

    【讨论】:

      【解决方案5】:

      您还可以在调试器中突出显示任何表达式并右键单击 -> 快速查看。这将执行表达式(假设它有效)并为您提供值。

      【讨论】:

        【解决方案6】:

        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

        【讨论】:

          【解决方案7】:

          您始终可以使用监视框来评估函数调用。

          Foo(valueIn);

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

          【讨论】:

          • 你要找的词是幂等的。
          【解决方案8】:

          一种解决方法是使用 Pascal 风格的结果变量:

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

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

          【讨论】:

            猜你喜欢
            • 2015-03-22
            • 2021-06-02
            • 2019-01-28
            • 2016-03-27
            • 2019-03-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多