在Visual Studio中调试时返回之前可以找到返回值吗?

问题描述 投票:357回答:20

采取以下功能:

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

当我在此函数中设置断点时,是否有可能检查返回的值? go()直接耦合到.aspx页面中的数据网格。

检查返回的数据表的唯一方法是使用临时变量。但是,这有点不方便。不是有另一种方式吗?

c# visual-studio visual-studio-debugging
20个回答
251
投票

从来没听说过。请注意,如果您确实添加了一个变量,那么编译器会在发布版本中删除它...

更新:This functionality has been added to VS2013。您可以在自动窗口中查看返回值,或在监视/即时窗口中使用$ReturnValue

该值只能在从函数返回后直接看到,因此访问它的最简单方法是在函数调用上放置一个断点并跳过(F10)调用。


VS2015更新:嘘!不幸的是,它似乎没有出现在VS2015中(devenv v14) VS2017更新:它回来了。 (devenv v15)


5
投票

有很多变通方法,但似乎没有一个令人满意。

引用下面的John Skeet(评论现已删除的答案):

仍然看起来不方便 - 特别是如果你不知道在开始调试之前你需要哪个返回值。每次我退回任何东西时,我真的不想让一个临时变量混乱我的代码

从理论上讲,调试器可以有一个return变量。毕竟:它只是堆栈中的变量:

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

因此,请考虑这是Visual Studio的功能请求。


2
投票

Microsoft Visual C ++曾经这样做,但Visual Studio不AFAIK .. :(


2
投票

我知道的唯一方法是在返回行上放置一个断点,然后调用Quick Watch窗口并输入返回的表达式:

someTableAdapter.getSomeData();

但是这只有在调用不改变任何对象的状态时才有效(因为当你将恢复执行时会再次调用同一个方法)。


2
投票

我想扩展PascalK's answer以使其在Visual Studio 2015中工作,因为有一个隐藏的功能,没有在Examine return values of method calls中记录。

如果嵌套函数调用,则会自动创建伪变量$ResultValueX,其中X表示函数调用顺序。因此,如果您有Multiply(Five(), Six())之类的调用,则会创建以下伪变量:

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

1
投票

您也可以要求在中间窗口中评估值,如果它没有设置标志或其他变量,但只返回一些内容。


1
投票

我想你可以通过查看Registers窗口(Debug / Windows / Registers)中的RAX寄存器来确定这一点。踩下(SHIFT + F11)函数后,检查RAX寄存器。我不知道一个事实,但是一旦登上月球你就可以检查一个寄存器(在.NET之前的日子里)并看到那里的返回值。它甚至可能是RAX和RBX等的组合。


1
投票

打开Debug→Autos窗口会让您关闭。它不会显示实际的返回值,但会显示return语句中的值。


1
投票

是的,切换到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
投票

The accepted answer在Visual Studio 2015中无法正常工作,但是通过在方法的最后一行放置一个断点并按下F10,它会将返回值的所有表达式放入locals窗口。


0
投票

您可以尝试选择"someTableAdapter.getSomeData();",右键单击它,然后选择Quick Watch。


58
投票

这可以在带有CLR 4.5.1 according to the customer feedback site的Visual Studio 2013中完成。它在以前的C#版本中不可用。

(Visual Studio 2008及更早版本支持VB.NET。它一直供C / C ++开发人员使用。)


-1
投票

将返回表达式拖放到监视窗口中。

例如,在声明中

return someTableAdapter.getSomeData();

拖放

someTableAdapter.getSomeData()

进入观察窗口,你会看到价值。

您可以为任何表达式执行此操作。


24
投票

我同意这是一个非常有用的东西:不仅在退出之前看到方法的返回值,而且还看到我刚刚步过的方法的返回值。我将它实现为Visual Studio的商业扩展的一部分,名为“OzCode”。

有了它,您可以在代码编辑器上查看方法返回值,作为HUD显示的一种:

有关更多信息,请参阅this video


22
投票

据微软称,没有办法用托管代码可靠地实现这一点。这是他们意识到并且正在努力解决的问题:

对于那些有调试本机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


19
投票

关于Visual Studio 2015:

根据Marc Gravell目前接受的答案:

functionality has been added to Visual Studio 2013。您可以在autos窗口中查看返回值,或在watch / immediate窗口中使用$ ReturnValue

该答案还表明此功能在Visual Studio 2015中不起作用。这不是(完全)真实的。在Examine return values of method calls上有以下注释:

您必须打开旧版表达式计算器才能识别$ ReturnValue(工具/选项/调试/使用旧版C#和VB表达式计算器)。否则,您可以使用$ ReturnValue1。

我在Visual Studio 2015 Enterprise中对此进行了测试:

  • 关闭传统表达式求值器:只有$ ReturnValue1有效
  • 打开传统表达式计算器:$ ReturnValue和$ ReturnValue1都有效

13
投票

如果您转到菜单工具→选项,IntelliTrace,并更改设置以收集事件和呼叫信息。

您可以返回上一个调用事件(Ctrl + Shift + F11),并在autos窗口中查看从方法调用返回的临时值,作为方法名称的子项。

这并没有显示您所在方法的返回值。它只显示当前方法中调用的最后一个方法的返回值。

所以,这很好

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

因为它显示了someTableAdapter.getSomeData()的返回值。

但不适用于:

int go(){return 100 * 99;}

12
投票

.NET .NET之前的旧技巧:打开Registers窗口,查看EAX寄存器的值。它包含最后一个被调用函数的返回值。


9
投票

使用Shift-F11退出go()方法,然后在“Autos”调试窗口中,它将显示刚从堆栈中弹出的方法调用的返回值(在本例中,go()方法是你想要什么)。这是Visual Studio 2005中的行为;我没有使用Visual Studio 2008,所以我不知道这个版本的行为是否相同。


7
投票

是的,有一种非常好的方式。一个重要的缺点是你必须等待5年,也许6年。因为我看到你在2008年11月发布,我建议你waaaaaa ...

... aaaait。瞧!只为你,MS发布了最新的Visual Studio 2013,它是一个默认功能,可以在调试模式下运行时从菜单中访问(菜单Debug→Windows→Autos)。

© www.soinside.com 2019 - 2024. All rights reserved.