none
Visual Studio 2010(VC++) 下 for循环调试问题, VS2010的BUG? RRS feed

  • 问题

  •  int j=0;
     for(; j<1; j++)  //此处设置断点
     {
      j = j+1-1;
     }

    反汇编代码如下:

     int j=0;
    012B10B7  mov         dword ptr [ebp-0C8h],0 
    012B10C1  jmp         CLayoutForm::OnInitialUpdate+1C2h (12B10D2h)  //此处为vs2003下的反汇编断点
     for(; j<1; j++)
    012B10C3  mov         eax,dword ptr [ebp-0C8h]  //此处为vs2010下的反汇编断点
    012B10C9  add         eax,1 
    012B10CC  mov         dword ptr [ebp-0C8h],eax 
    012B10D2  cmp         dword ptr [ebp-0C8h],1 
    012B10D9  jge         CLayoutForm::OnInitialUpdate+1D9h (12B10E9h) 
     {
      j = j+1-1;
    012B10DB  mov         eax,dword ptr [ebp-0C8h] 
    012B10E1  mov         dword ptr [ebp-0C8h],eax 
     }
    012B10E7  jmp         CLayoutForm::OnInitialUpdate+1B3h (12B10C3h) 

    调试运行时, 通过反汇编可以看到vs2010和vs2003断点位置不同, 导致的结果就是, 在vs2010下只能在第二次执行循环体时才能停下来. 这种现象只有在循环变量赋值语句为空时发生.

    代码的运行结果是正确的,但是调试的行为是令人误解的,算不算BUG?

    2011年6月8日 5:00

全部回复

  • 刚才我也试了一下,发现vs2005也有同样的问题。这应该算是bug了,因为如果有下面这种代码

    int i = 0;

    for( ; i < 10; i++)

    {

            //do something

            if(condition)

            {

                    break;

            }

    }

    恰好第一次循环时condition成立,那么断点就完全失效了。

    很有意思的问题,哈哈。

     

    Wang Wenqiang

    2011年6月9日 9:34