VIsual Studio - 如何在调试器中更改方法的返回值?

时间:2009-01-19 05:43:38

标签: visual-studio debugging

当我调试时,我经常需要处理不使用中间变量存储返回值的方法:

   private int myMethod_1()
   {
      return 12;
   }

   private int myMethod_2()
   {
      return someCall( someValue );
   }

好吧,为了重新创建一个bug,我经常需要动态更改值。在这里,我想看看当myMethode_1返回零时会发生什么。 myMethod_2也是如此。

有没有办法在不修改代码的情况下执行?我想做的是,在返回行(或结束括号)上放置一个断点并输入一个新的返回值。

注意:我正在使用Visual Studio 2005和Visual Studio 2008。

谢谢!

6 个答案:

答案 0 :(得分:4)

函数的返回值通常在EAX寄存器中返回。

如果在函数末尾设置断点,则更改EAX可能会更改返回值。您只需在观察窗口中写下其名称即可更改和查看visual studio中的任何注册表 如果您进行了优化,或者即使该函数像return 12那样简单,这可能会失败。如果您返回的内容不适合32位寄存器,那么它可能也无法工作。 至少值得一试。

答案 1 :(得分:4)

对于那些在VB.NET中寻找解决方案的人来说:

这很简单,我无法相信我没有看到它:要查看函数将返回的值:只需将指针放在函数的名称上。该值将显示在工具提示中。

更改值:只需单击此工具提示,更改值并按Enter键。

Visual Studio很酷!

注意:我在Visual Studio Team System 2008上使用VB.NET进行了测试。只是尝试使用C#,但它不起作用......: - (

答案 2 :(得分:1)

不要这么认为 您需要在被调用者或调用者中有一个临时变量,以便在IDE Debugger / QuickWatch窗口中获取值的句柄以对其进行修改。因此,最简单,最快捷的方法是对现有代码进行注释,并对debug-what-if进行临时更改。

private int myMethod_1()
{
  var x = 12;
  return x;
}

private int myMethod_2()
{
  var y = someCall( someValue);
  return y;
}

不要认为值得加重“避免代码更改”这样做。如果我FUBAR,我会结账,我们又是黄金。

答案 3 :(得分:1)

你需要的是Mocking。结帐模拟框架,如Rhinomock,Moq或Typemock。

对于您所描述的场景,我将假设您可能没有干净的合约驱动开发,并且可能需要返回假行为/状态。在这种情况下,Typemock可能是您的最佳选择,尽管它是商业

答案 4 :(得分:0)

为什么要更改被调用方法的返回值?您可以在Calling方法中即时轻松更改它。一旦函数返回,您将获得返回的值,您可以在其中进行更改。

   private int myMethod_1()
   {
      return 12;
   }
//call would be something like this
int x = myMethod_1();
//Here you can change the value after the execution of the above line.

即使您没有将返回值存储在变量中,并且您直接将其传递给其他方法,即使这样,您也可以通过单步执行该方法并更改其中的参数值来更改该值。我在这里错过了什么吗?

答案 5 :(得分:-1)

我认为你可以在Visual Studio中做到这一点但对我来说感觉很脏。

我的想法是你应该真正研究一个单元测试框架和模拟,这样你就可以将myMethod_2的输出假为0并看看它对你的代码有什么影响。 IMO。通过这种方式,您可以在单元测试中保留返回0检查,以确保丑陋的bug不会再次抬头。