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

取以下函数:

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

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

检查返回数据表的唯一方法是使用临时变量。然而,这有点不方便。没有别的办法了吗?

99314 次浏览

据我所知没有。注意,如果你添加了一个变量,它将被编译器在发行版中删除…

< >强更新: 这个功能已经被添加到VS2013中。 你可以在自动窗口中看到返回值,或者在watch/immediate窗口中使用$ReturnValue

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


更新VS2015: boo!不幸的是,它似乎不在VS2015 (devenv v14)
VS2017更新:它回来了。(devenv v15) < / p >

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

如果中间窗口没有设置标志或其他变量,而只是返回一些东西,您也可以要求在中间窗口中计算值。

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

打开调试→自动窗口可以关闭。它不会显示实际的返回值,但它会显示在返回语句中计算的值。

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

someTableAdapter.getSomeData();

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

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

例如,在语句中

return someTableAdapter.getSomeData();

拖放

someTableAdapter.getSomeData()

进入一个观察窗口,你会看到数值。

你可以对任何表达式这样做。

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

下面引用约翰·斯基特的话(对现已删除的答案的评论):

对我来说还是不方便- 特别是如果你不知道是哪一个 返回你需要的值 在开始调试之前。我真的 不想要有一个临时的 变量混乱我的代码每 t

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

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

因此,请将此视为Visual Studio的一个特性请求。

微软Visual c++曾经这样做,但Visual Studio不AFAIK..:(

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

visual studio2008及更早的版本支持VB.NET。C/ c++开发人员一直可以使用它。)

如果你去菜单工具选项, IntelliTrace,并改变设置来收集事件和调用信息。

您可以返回到前面的调用事件(Ctrl + 转变 + ),并在autos窗口中看到方法调用返回的临时值作为方法名的子值。

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

所以,对于

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

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

但不是为了:

int go(){return 100 * 99;}

我同意这是一件非常有用的事情:不仅可以在退出方法之前看到它的返回值,而且还可以看到我刚刚跳过的方法的返回值。我把它作为Visual Studio商业扩展的一部分来实现,名为“OzCode”。

有了它,你可以直接在代码编辑器中查看方法的返回值,就像一种hud显示:

语句可视化

更多信息,请参见这个视频

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

对于那些有调试原生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

前。net时代的老把戏:打开寄存器窗口并查看EAX寄存器的值。它包含最后调用的函数的返回值。

我认为您可以通过查看寄存器窗口(调试/ Windows /寄存器)中的RAX寄存器来确定这一点。退出函数(SHIFT + F11)后,检查RAX寄存器。我不知道事实,但你可以检查一个寄存器(在。net时代之前)并看到那里的返回值。它甚至可能是RAX和RBX的组合,等等。

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

在我的记忆中(从Visual Basic到VB.NET的所有版本),您可以简单地查询函数名。它像一个在函数开始隐式声明的局部变量一样“起作用”,它的当前值也被用作函数通过非返回语句方式退出时的返回值(例如Exit Function或只是通过),当然,当使用return语句时。

它还被设置为return语句的表达式。就像局部变量一样,它的值可以在函数内部的任何执行点检查(包括在return语句执行之后)。c#没有,也应该有。

那个小贱人。NET特性(加上它支持的Exit Function语句——另一个c#没有但应该有的特性)在我实践的防御性编程形式中非常有用,我总是将函数名初始化为失败/默认值作为第一条语句。然后,在任何失败点(通常比成功点发生得更频繁),我可以简单地调用Exit Function语句(即不需要复制失败/默认表达式或甚至常数/变量名)。

是的,有一个很好的方法。一个显著的缺点是你必须等待5年,也许6年。自从我看到你在2008年11月发的帖子,我建议你waaaaaa…

……aaaait。瞧!只是为了你,MS已经发布了最新的Visual Studio 2013,它是一个默认功能,可从菜单在运行在调试模式(菜单调试窗户汽车)。

关于Visual Studio 2015:

根据Marc Gravell目前公认的答案:

这个功能已添加到visual Studio 2013 < p >。你可以看到回报 值在自动窗口或使用$ReturnValue在手表/立即 窗口< / p >

该回答还指出,该功能在visual Studio 2015中不起作用。这并不(完全)正确。在检查方法调用的返回值上有以下注释:

必须打开遗留表达式求值器,才能识别ReturnValue美元)。否则,你可以使用ReturnValue1美元

我在visual studio 2015 Enterprise中进行了测试:

  • 关闭遗留表达式求值器:只有 ReturnValue1美元工作
  • 打开遗留表达式求值器:这两个 ReturnValue美元 而且 ReturnValue1美元工作

我想对PascalK的回答进行扩展,以使其在Visual Studio 2015中工作,因为有一个隐藏的特性在检查方法调用的返回值中没有记录。

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

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

公认的答案在Visual Studio 2015中不能正常工作,但是通过在方法的最后一行放置断点并按F10,它将把返回值的所有表达式放入locals窗口。

在VS2019中,只需进入调试->Windows->汽车窗口。在那里,你看到concat返回值如下所示:

enter image description here