当调试C/C++(?非托管)在VS代码,走出一个功能后,您可以在“汽车”窗口中看到的返回值:VS获取C#代码中的返回值?
alt text http://img156.imageshack.us/img156/6082/cpp.jpg
然而,这不起作用对于C#代码:
alt text http://img120.imageshack.us/img120/9350/38617355.jpg
如何获得比与混乱的临时变量的代码之外的返回值什么建议吗?
当调试C/C++(?非托管)在VS代码,走出一个功能后,您可以在“汽车”窗口中看到的返回值:VS获取C#代码中的返回值?
alt text http://img156.imageshack.us/img156/6082/cpp.jpg
然而,这不起作用对于C#代码:
alt text http://img120.imageshack.us/img120/9350/38617355.jpg
如何获得比与混乱的临时变量的代码之外的返回值什么建议吗?
它实际上是可见的。调试+其他Windows +寄存器。看看EAX(x64中的RAX)的值。 EAX寄存器中返回简单整型的值。 EDX长:EAX。 STx中的浮点(XMM00,位于x64)。
这很难实现,抖动决定了方法如何返回一个值,不同的抖动会做出不同的选择。特别是当返回值类型不是很简单时,就像一个结构体。如果它很大,那么抖动将在调用方法上保留堆栈空间,并将指针传递到该空间,以便被调用的方法可以在那里复制返回值。尽管如此,VS2013 finally made it available,目前可在预览。在Autos窗口中可见并使用立即窗口中的内部变量并观察表达式。
不幸的是,在托管代码(C#或VB)中,只能使用临时变量混淆您的代码。 CLR不支持调试器中的“管理返回值”,因此VS也不支持。
在C++中这个特性有点简单。 C++可以抓取最后一个返回值的寄存器或堆栈位置。它不必处理JITer和垃圾收集等问题。这两者都使诸如此类的功能大大复杂化。
如果您喜欢此功能,我强烈鼓励你提交功能要求或投票对连接
您可以设置一个现有的主返回一个int,如果从Main()获得返回值可以帮助您,但是您将无法看到test()例程的返回值,正如Jared所提到的。所以,如果你想看到值,你必须弄乱代码。
Visual Studio 2013将此功能添加到C#和VB代码中。请在预览http://www.microsoft.com/visualstudio/eng/2013-preview中查看,并让我们知道您的反馈。
它终于在VS 2013中实现了。阅读长篇故事on the VS blog。
简而言之:跨过方法调用出或填充汽车窗口与所调用的方法(或多个)的结果(S)。图像说话比文字好:
开始调试。
跳过方法调用。
利润!请注意,显示嵌套方法调用的全部的返回值。太好了!
奖励! 64位代码编辑和继续也被实现!
至少在2010年,VB似乎能够很好地处理它,所以看起来CLR似乎需要任何支持。我错过了什么吗? http://blog.sublogic.com/2010/12/11/showing-c-method-return-in-debugger-vb-net-can-do-it/ – 2010-12-14 04:25:42
@詹姆斯短回答:没有CLR没有添加此功能,它是VB.Net如何生成代码的工件。较长的答案:VB.Net支持通过分配函数名返回值(我相信VB6功能)从函数返回的概念。这是通过创建一个具有相同名称的函数和匹配返回类型的隐藏本地来完成的。调试中的编译器会将返回语句转换为本地分配,然后返回本地(这里的IL非常有启发性)。调试器了解这个本地并显示它 – JaredPar 2010-12-14 17:11:19