在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的一部分。
根据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器可能有一个return
variables。 毕竟:它只是一个堆栈上的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。