在Visual Studio中debugging时返回之前可以找出返回值吗?

采取以下function:

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

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

检查返回的数据表的唯一方法是使用一个临时variables。 但是,这有点不方便。 没有其他办法吗?

从来没听说过。 请注意,如果您添加了一个variables,它将会被编译器在发布版本中删除。

更新: 此function已被添加到VS2013 。 您可以在自动窗口中看到返回值,或者在watch / immediate窗口中使用$ReturnValue

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


更新VS2015:嘘! 不幸的是,它似乎不在VS2015(devenv v14)

根据客户反馈网站,可以在Visual Studio 2013中使用CLR 4.5.1完成此操作。 它在以前的C#版本中不可用。

(VS2008和更早版本支持VB.NET,C / C ++开发人员一直都可以使用它。)

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

有了它,您可以在代码编辑器上查看方法返回值,例如HUD显示:

语句可视化

有关更多信息,请参阅此video 。

据微软称,托pipe代码无法可靠地实现这一点。 这是他们意识到和正在研究的问题:

对于那些有debugging本地C ++或VB6代码经验的人,可能使用了一个function,在Autos窗口中为你提供函数返回值。 不幸的是,托pipe代码不存在这个function。 虽然您可以通过将返回值分配给本地variables来解决此问题,但这并不方便,因为它需要修改代码。 在托pipe代码中,确定一个函数的返回值是多么的复杂。 我们意识到我们在这里不能一直做正确的事情,所以我们删除了该function,而不是在debugging器中给出错误的结果。 不过,我们希望为您带来这一点,我们的CLR和debugging团队正在寻找一些解决这个问题的解决scheme。 不幸的是,这不会是Visual Studio 11的一部分。

https://connect.microsoft.com/VisualStudio/feedback/details/597933/add-a-return-pseudo-variable-to-the-visual-studio-debugger-for-net-code

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

此function已被添加到VS2013 。 您可以在自动窗口中看到返回值,或者在watch / immediate窗口中使用$ ReturnValue

该答案还指出,这个function在VS2015中不起作用。 这不是(完全)真实的。 在https://msdn.microsoft.com/en-us/library/dn323257.aspx上有以下说明:;

您必须打开遗留的expression式计算器才能识别$ ReturnValue (工具/选项/debugging/使用传统的C#和VBexpression式计算器 )。 否则,您可以使用$ ReturnValue1

我在VS2015 Enterprise中testing了这个:

  • 遗留的expression式计算器closures: 只有 $ ReturnValue1有效
  • 遗留expression式计算器打开: $ ReturnValue $ ReturnValue1都起作用

如果您selectIntelliTrace,并更改设置以收集事件和通话信息。 您可以返回到上一个呼叫事件(Ctrl + Shift + F11),并将自动窗口中方法调用返回的临时值作为方法名的子项。

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

所以,这样做很好:

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

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

但不适用于:

 int go(){return 100 * 99;} 

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

使用Shift-F11跳出go()方法,然后在“Autos”debugging窗口中显示刚刚popup堆栈的方法调用的返回值(在这种情况下,go()方法是你要什么)。 这是Visual Studio 2005中的行为; 我没有使用过Visual Studio 2008,所以我不知道这个版本的行为是否一样。

是的,有一个非常好的方法。 一个显着的缺点是你不得不等待5年,也许6年。 既然我看到你在2008年11月发布,我build议你waaaaaa …

… aaaait。 瞧! 为了您,MS已经发布了最新的Visual Studio 2013 ,在debugging模式( Debug – > Windows – > Autos )下运行时 ,这是一个默认的菜单function。

NB。 我明白,你的问题早已解决或遗忘。 不过,当我在同一个问题上search时,我受到了这个打击,所以值得更新。 不过,这只是一个笑话而已。

有很多解决方法,但没有一个看起来令人满意。

引用下面的John Skeet:

仍然看起来不方便 – 特别是如果你不知道在开始debugging之前需要哪个返回值。 我真的不希望每次我都返回任何东西时,都不得不让我的代码有一个临时variables

理论上,debugging器可能有一个returnvariables。 毕竟:它只是一个堆栈上的variables:

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

所以考虑一下Visual Studio的function请求。

我知道的唯一方法是在返回行上放置一个断点,然后调用快速监视窗口并input返回的expression式:

someTableAdapter.getSomeData();

但是,这只有在调用不会改变任何对象的状态(因为当你恢复执行时会有第二次调用同样的方法)。

Microsoft Visual C ++用来做到这一点,但Visual Studio不AFAIK .. 🙁

我想扩展@PascalK的答案,使其在VS2015中可以正常工作,因为有一个隐藏function,这个function在https://msdn.microsoft.com/en-us/library/dn323257.aspx上没有logging。;

如果您有嵌套的函数调用,则会自动创build伪variables$ResultValueX ,其中X引用函数调用顺序。 所以如果你有一个诸如Multiply(Five(), Six())的调用,就会创build下面的伪variables:

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

如果不设置标志或其他variables,而只返回一些内容,也可以要求在中间窗口中评估值。

打开Debug-Autos窗口让你closures。 它不会显示实际的返回值,但会显示返回语句中评估的内容。

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

是的,通过切换到VB.NET。 ; P(你只是说“Visual Studio”);

只要我记得(从VB通过所有版本的VB.NET),你可以简单地查询函数名称。 它的function类似于在函数开始时隐式声明的局部variables,当函数通过非返回声明方式退出(即退出函数或刚刚通过)时,其当前值也用作返回值,当然当使用返回语句时,它也被设置为返回语句的expression式。 就像局部variables一样,它的值可以在函数内部的任何执行点(包括执行返回语句之后)被检查。 C#没有这个,应该。

这个小小的VB.NETfunction(加上退出function声明,它启用 – 另一个functionC#没有和应该)是非常有用的一种forms的防御性编程我的做法,我总是初始化函数名称的失败/默认值作为第一个声明。 然后,在任何失败点(通常比成功点更频繁地发生),我可以简单地调用退出函数语句(即不必重复失败/默认expression式,甚至是一个常量/variables名称)。

我知道这是一个老问题,但由于接受的答案在2015年不能正常工作,我将添加一个解决方法。

通过在方法的最后一行放置一个断点,按下f10将返回值的所有expression式放到本地窗口中。

你可以尝试select“someTableAdapter.getSomeData();”,右键点击它,并进入快速观察。

将返回expression式拖放到观察窗口中。

例如:在声明中

返回someTableAdapter.getSomeData();

拖放

someTableAdapter.getSomeData()

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

你可以做任何expression。