English 中文(简体)
在 C# 代码中获取返回值?
原标题:
  • 时间:2009-02-26 15:45:28
  •  标签:

在VS中调试C/C++(非托管)代码,在步出一个函数后,可以在autos窗口中看到返回的值:

将此翻译成中文: 替代文字 http://img156.imageshack.us/img156/6082/cpp.jpg

然而,这对于C#代码不起作用:

把这个翻译成中文: alt text http://img120.imageshack.us/img120/9350/38617355.jpg 无障碍文本 http://img120.imageshack.us/img120/9350/38617355.jpg

除了使用临时变量使代码混乱之外,有何建议可以获取返回值?

最佳回答

这是可以看到的。调试+其他窗口+寄存器。查看EAX(x64中的RAX)的值。简单积分类型的值在EAX寄存器中返回。EDX:EAX中的长整数。浮点数在STx(x64中的XMM00)中。


这个实现起来很困难,抖动决定了方法返回值的方式,不同的抖动会做出不同的选择。特别是当返回值类型不简单时,比如一个结构体。如果结构大,则抖动会在调用方法中保留堆栈空间,并传递一个指向该空间的指针,以便被调用方法可以将返回值复制到那里。尽管如此,VS2013最终将其提供,目前可以在预览版中使用。在 Autos 窗口中可见,并使用 Immediate 窗口和监视表达式中的 $ReturnValue 内在变量。

问题回答

不幸的是,在托管代码中(C#或VB),使用临时变量来混淆您的代码是唯一的方法。CLR在调试器中没有支持“托管返回值”,因此VS也没有。

在C++中,这个特性要简单一些。C++只需要获取上一个返回值的寄存器或栈位置。它不必处理像JITer和垃圾回收这样的问题。这两个问题会极大地复杂化这样一个特性。

如果您想要这个功能,我强烈鼓励您在Connect上提交一个功能请求或投票支持已有的功能请求。

将此翻译成中文: https://connect.microsoft.com/VisualStudio https://connect.microsoft.com/VisualStudio

Visual Studio 2013 年增加了这种功能的 C#和 VB 代码。 请在预览中查看

http://www.microsoft.com/visualstudio/eng/2013-preview,并告诉我们您的反馈。

如果从Main()返回值有所帮助,您可以设置Main以返回int,但是正如Jared所提到的那样,您将不会看到test()例程的返回值。因此,如果您想要查看值,您必须使代码混乱。

它终于在VS 2013中实现了。在VS博客上阅读有关详细信息。

简而言之:从方法调用中退出跨过,会用所调用的方法的结果填充Autos窗口。图片比语言更能表达:

  1. Start debugging.
    enter image description here

  2. 跨越方法调用。

  3. Profit! Notice that the return values of all the nested method calls are displayed. Nice!

    enter image description here

点击此处下载VS 2013预览版,亲自试用。

奖励! 64位代码的编辑和继续也已实现!





相关问题
热门标签