我可以找出在Visual Studio调试时返回之前的返回值?我可以找出在Visual Studio

2019-05-10 09:44发布

看看下面的功能:

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

当我在此函数设置一个断点,有没有检查返回值的可能性? go()被直接地耦合到数据网格中一个.aspx页。

检查传回的数据表的唯一方法就是使用一个临时变量。 然而,这是一个有点不方便。 是不是有另一种方式?

Answer 1:

从来没听说过。 请注意,如果添加一个变量,它会被编译器移除在发布版本反正...

更新: 此功能已经被添加到VS2013 。 你可以看到返回值在汽车窗户或使用$ReturnValue在手表/即时窗口。

的值只能从函数返回,从而访问它是通过将一个断点函数调用和跨过(F10)该呼叫的最简单的方法后直接看到。


更新VS2015:嘘! 不幸的是,它不会出现在VS2015(devenv的V14)
更新VS2017:它的背部。 (devenv的V15)



Answer 2:

这可以在Visual Studio 2013 CLR 4.5.1完成根据客户的反馈信息网站 。 这是不是在以前的版本为C#提供。

(Visual Studio 2008和更早支持它VB.NET。一直以来,提供给C / C ++开发人员。)



Answer 3:

我同意这是有一个非常有用的东西:不仅看到走出去的,但也看到的我刚跨过方法的返回值之前,该方法的返回值。 我实现了它作为一个商业扩展到Visual Studio所谓的“部分OzCode ”。

有了它,你可以直接在代码编辑器中查看方法的返回值,不大不小的HUD显示的:

欲了解更多信息,请参阅该视频 。



Answer 4:

据微软称,没有办法用托管代码可靠实现这一点。 这是他们知道的和正在研究的问题:

对于那些在那里谁拥有经验调试本机C ++或VB6的代码,你可能已经用在在汽车窗口中为您提供了函数的返回值的功能。 不幸的是,这个功能不存在托管代码。 虽然可以通过指定返回值局部变量解决这个问题,因为它需要修改代码,这是不是很方便。 在托管代码,它的很多麻烦,以确定哪些你已经跨过了一个函数的返回值。 我们意识到,我们不能做正确的事情一直在这里等我们去掉了功能,而不是让你在调试器中不正确的结果。 但是,我们希望把这个为你回来和我们的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



Answer 5:

据马克Gravell目前接受的答案:

此功能已被添加到Visual Studio 2013 。 你可以看到返回值在汽车窗户或手表/即时窗口使用$返回值

这个问题的答案还指出,此功能不会在Visual Studio 2015年这不(完全)正确工作。 在检查返回值的方法调用有以下注意事项:

你必须有遗留表达评价者开启$返回值被认可(工具/选项/调试/使用传统的C#和VB表达评估 )。 否则,你可以使用$ ReturnValue1。

我在Visual Studio 2015年企业测试这样的:

  • 与传统的表达评估关闭: $ ReturnValue1作品
  • 与传统表达评价者打开: $返回值 $ ReturnValue1工作


Answer 6:

如果你去菜单工具选项 ,智能跟踪,并更改设置来收集事件和呼叫信息。

您可以返回到以前的呼叫事件( 按Ctrl + Shift + F11),并看到在汽车窗从方法调用返回的方法名的孩子临时值。

这是不是显示你,你是在方法的返回值。这只是表明你被称为当前方法的最后一个方法的返回值。

所以,这是罚款

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

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

但不适合:

int go(){return 100 * 99;}


Answer 7:

从前期.NET日龄招:打开寄存器窗口,并期待在EAX寄存器的值。 这包含所谓的最后一个函数的返回值。



Answer 8:

走出去()方法的使用Shift键F11,然后在“汽车”调试窗口会显示刚刚弹出堆栈(在这种情况下,方法调用,旅途中()方法,它是返回值你想要什么)。 这是在Visual Studio 2005中的行为; 我没有使用Visual Studio 2008中,所以我不知道这表现在该版本相同的方式。



Answer 9:

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

... aaaait。 瞧! 只为你,MS发布了最新的Visual Studio 2013它是从菜单中访问的默认功能在调试模式(菜单调试视窗汽车运行时



Answer 10:

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

引述如下(在现在删除的答案评论)约翰·斯基特:

看起来还是不方便对我来说 - 尤其是如果你不知道你会开始调试前需要哪些返回值。 我真的不希望有有一个临时变量每次我再回到anything.t时间塞满了我的代码

从理论上讲,调试器可以有return -variable。 毕竟:这只是在栈上的变量:

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

所以认为这为Visual Studio功能请求。



Answer 11:

微软的Visual C ++来做到这一点,但Visual Studio不会AFAIK .. :(



Answer 12:

我所知道的唯一方法是将一个断点在回行,然后调用快速监视窗口,进入返回的表达式:

someTableAdapter.getSomeData();

但是,如果调用不会改变任何对象的状态(因为会有同样的方法第二个电话时,你会继续执行),这仅适用。



Answer 13:

我想在扩大PascalK的回答获得此在Visual Studio 2015年的工作,因为有一个隐藏的功能未记录在检查方法调用的返回值

如果您有嵌套函数调用,伪变量$ResultValueX会自动创建,其中X是指函数调用顺序。 所以,如果你有一个调用,如Multiply(Five(), Six())将创建以下伪变量:

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


Answer 14:

您也可以要求以评估在中间窗口中的价值以及,如果不设置标志或其他变量,但只返回的东西。



Answer 15:

我想你可以通过查看该寄存器窗口(调试/窗/寄存器)的RAX寄存器确定这一点。 走出函数(SHIFT + F11)后,检查RAX寄存器。 我不知道一个事实,但在一个月亮,一旦你可以检查寄存器(预.NET天),看看返回值出现。 它甚至可能是RAX和RBX等的组合



Answer 16:

打开调试→自动窗口让你接近。 它不会显示实际的返回值,但它会显示在return语句什么评价。



Answer 17:

Yeah, by switching to VB.NET. ;P (You did just say "Visual Studio". ;)

For as long as I can remember (from Visual Basic through all versions of VB.NET), you can simply query the function name. It "functions" like a local variable that's implicitly declared at the start of the function and its current value is also used as the return value whenever the function exits via non-return statement means (i.e. Exit Function or just falling through) and of course, when the return statement is used.

It is also set to the return statement's expression. Just like a local variable, its value can be inspected at any point of execution inside the function (including after the return statement is executed). C# doesn't have this and should.

That little VB.NET feature (plus the Exit Function statement which it enables - another feature C# doesn't have and should) is very useful in a form of defensive programming I practice where I always initialize the function name to the failure/default value as the first statement. Then, at any failure point (which normally occurs much more often than success points), I can simply call the Exit Function statement (i.e. without having to duplicate the failure / default expression or even a constant/variable name).



Answer 18:

接受答案不与Visual Studio 2015年正常工作,但通过放置方法的最后一行一个破发点,并按下F10,它会把返回值的所有表达式为当地人窗口。



Answer 19:

你可以尝试选择"someTableAdapter.getSomeData();" ,右键单击它,然后去快速观察



Answer 20:

拖放回报表现为观察窗口。

例如,在语句

return someTableAdapter.getSomeData();

拖放

someTableAdapter.getSomeData()

为监视窗口,你会看到的价值。

您可以为任意表达式做到这一点。



文章来源: Can I find out the return value before returning while debugging in Visual Studio?