C# 在VisualStudio中调试时,在返回之前是否可以找到返回值?
执行以下功能:C# 在VisualStudio中调试时,在返回之前是否可以找到返回值?,c#,visual-studio,visual-studio-debugging,C#,Visual Studio,Visual Studio Debugging,执行以下功能: DataTable go() { return someTableAdapter.getSomeData(); } 当我在此函数中设置断点时,是否有可能检查返回值go()直接耦合到.aspx页面中的数据网格 检查返回数据表的唯一方法是使用临时变量。但是,这有点不方便。还有别的办法吗?我不知道。请注意,如果您确实添加了一个变量,它将被编译器在发布版本中删除 更新: . 您可以在自动窗口中查看返回值,也可以在监视/即时窗口中使用$ReturnValue 只有从函数返回后才能
DataTable go() {
return someTableAdapter.getSomeData();
}
当我在此函数中设置断点时,是否有可能检查返回值go()
直接耦合到.aspx
页面中的数据网格
检查返回数据表的唯一方法是使用临时变量。但是,这有点不方便。还有别的办法吗?我不知道。请注意,如果您确实添加了一个变量,它将被编译器在发布版本中删除 更新: . 您可以在自动窗口中查看返回值,也可以在监视/即时窗口中使用
$ReturnValue
只有从函数返回后才能直接看到该值,因此访问该值的最简单方法是在函数调用上放置断点并逐步跳过(F10)调用
VS2015更新:嘘!不幸的是,它似乎不在VS2015(devenv v14)中
VS2017的更新:它回来了。(devenv v15)您可以尝试选择
“someTableAdapter.getSomeData();”
,右键单击它,然后快速查看。如果中间窗口没有设置标志或其他变量,但只返回一些内容,您也可以要求在中间窗口中计算值。使用Shift-F11跳出go()方法,然后在“Autos”调试窗口中,它将显示刚刚从堆栈中弹出的方法调用的返回值(在本例中,是您想要的go()方法)。这是VisualStudio2005中的行为;我还没有使用Visual Studio 2008,所以我不知道在该版本中是否会出现相同的行为。打开调试→ 自动窗口让你接近。它不会显示实际返回值,但会显示return语句中计算的内容。我知道的唯一方法是在返回行上放置一个断点,然后调用Quick Watch窗口并输入返回的表达式:
someTableAdapter.getSomeData();
但这仅在调用不改变任何对象的状态时有效(因为当您恢复执行时,将有第二次调用相同的方法)。将返回表达式拖放到监视窗口中 例如,在声明中
return someTableAdapter.getSomeData();
拖放
someTableAdapter.getSomeData()
进入一个手表窗口,你会看到它的价值
您可以对任何表达式执行此操作。有许多变通方法,但似乎没有一种是令人满意的 下面引用John Skeet的话(对现已删除的答案的评论): 我还是觉得不方便- 特别是如果你不知道是哪个 返回您需要的值 在开始调试之前。我真的 我不想有一个临时的 变量使我的代码每天都乱七八糟 我什么时候还回来 理论上,调试器可以有一个
返回
-变量。毕竟:它只是堆栈上的一个变量:
unsafe {
int * sp = stackalloc int[1];
try {
return a+b;
}
finally {
Trace.WriteLine("return is " + *(sp+3));
}
}
考虑这是VisualStudio的一个特性请求。
< P>微软Visual C++用于此,但VisualStudio不AFIAK…(这可以在Visual Studio 2013中使用CLR 4.5.1完成。在以前的C#版本中不可用 (VisualStudio2008和更早版本支持VB.NET。C/C++开发人员始终可以使用它。)如果您转到菜单工具→ 选项、IntelliTrace和更改设置以收集事件和呼叫信息 您可以返回到上一个调用事件(Ctrl+Shift+F11),并在autos窗口中查看从方法调用返回的临时值作为方法名称的子级 这不会显示所使用方法的返回值。它只显示当前方法中调用的最后一个方法的返回值 所以,这对我来说很好DataTable go(){return someTableAdapter.getSomeData();}
它显示了someTableAdapter.getSomeData()的返回值
但不是为了:
int go(){return 100 * 99;}
我同意这是一件非常有用的事情:不仅要在退出方法之前看到方法的返回值,还要看到我刚刚跳过的方法的返回值。我将其作为Visual Studio商业扩展名为“”的一部分实现
使用它,您可以在代码编辑器上查看方法返回值,类似于HUD显示:
有关详细信息,请参阅。根据Microsoft的说法,无法使用托管代码可靠地实现这一点。这是他们意识到并正在解决的问题:
对于那些有经验调试C++或VB6代码的人来说,你可能已经使用了一个在自动窗口中为你提供函数返回值的特性。不幸的是,这个功能不存在于托管代码中。方便,因为它需要修改您的代码。
在托管代码中,确定您跳过的函数的返回值要复杂得多。我们意识到,我们在这里无法始终如一地执行正确的操作,因此我们删除了该功能,而不是在调试器中为您提供错误的结果。但是,我们希望为您提供此功能,我们的CLR和调试器团队正在寻找ng正在寻找解决此问题的一些潜在解决方案。不幸的是,这不是Visual Studio 11的一部分
以前.NET时代的老把戏:打开寄存器窗口,查看EAX寄存器的值。这包含上次调用的函数的返回值。我认为您可以通过查看寄存器窗口(调试/窗口/寄存器)中的RAX寄存器来确定这一点。退出后(SHIFT+F11)在函数中,检查RAX寄存器。我不知道有什么事实,但有一天你可以检查一个寄存器(在.NET之前的日子)并查看返回值。它甚至可能是RAX和RBX的组合,等等。是的,切换到VB.NET。;p(你刚才说的是“Visual Studio”。)
从我记事起(从Visual Basic到
Five() | $ResultValue1 = 5
Six() | $ResultValue2 = 6
Multiply() | $ResultValue3 = 30