当我调试时,我经常需要处理不使用中间变量存储返回值的方法:
private int myMethod_1()
{
return 12;
}
private int myMethod_2()
{
return someCall( someValue );
}
好吧,为了重新创建一个bug,我经常需要动态更改值。在这里,我想看看当myMethode_1
返回零时会发生什么。 myMethod_2
也是如此。
有没有办法在不修改代码的情况下执行?我想做的是,在返回行(或结束括号)上放置一个断点并输入一个新的返回值。
注意:我正在使用Visual Studio 2005和Visual Studio 2008。
谢谢!
答案 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不会再次抬头。