VS2010调试器无法在监视窗口中正确跟踪变量,VS2013是否仍然存在此错误?
VS2010 debugger doesn't track variables correctly in the watch window, does VS2013 still have this bug?
Visual Studio 2010调试器在跟踪手表变量内存位置时出现问题。有时它会严重误导你,因为VS2010没有显示你认为它显示给你的变量。
例如,如果你在函数中重用了一个变量名,那么随着执行范围的改变,应该在监视窗口中显示哪个内存位置:
for (int i=0; i<10; i++) {
i=i+1; // do something, what isn't important
}
int i;
for (i=0; i<5; i++) {
i=i+1; // do something
}
printf("i=%dn", i);
现在把变量i放到观察窗口
显然,哪个i(或值)显示在手表窗口很重要。如果运行该程序,您将看到,当它进入for循环时,watch会跟踪for循环的i变量。当它退出for循环,然后用另一个同名变量击中下面的代码时,watch窗口不会跟踪该变量的内存。
您将看到watch窗口仍然声明i为10,即使在第二个循环中i现在是0,1,2,…在第二个循环之后,I实际上是6,但是watch窗口仍然声明I是10。
看表窗口应该做什么?我认为,它应该总是向您显示具有该手表名称的变量的值,即在作用域中,因为语言规则告诉您在任何给定时间内,这些变量中只有一个在作用域中。
这是调试器的监视窗口功能中的一个错误(VS2010似乎便宜地只是找到与您在监视中给出的名称相匹配的函数中的第一个变量,并顽强地监视该内存空间,不管代码中还有什么,即使具有相同名称的新变量已经接管了范围(此时监视窗口现在对您撒谎!)
当我在VS2010上时,需要留在那里,微软不会解决旧版本中的错误,我想知道这个错误是否仍然存在于VS2013中。我可能很快就会并行安装VS2013,但值得指出的是,为了防止其他人被监视窗口声称的变量值所误导。(更糟糕的是,当您将鼠标移到调试器代码中的范围内变量名称上时,错误的值将显示为'工具提示'。
我在VS 2013上多次遇到同样的问题:(
你总是可以打开反汇编窗口,在那里检查程序真正递增的是什么。您应该查看它是堆栈地址(最有可能在调试模式下)还是寄存器。
可以在即时窗口中转储寄存器值,也可以直接在观察窗口中转储寄存器值。堆栈地址也是如此。只需键入您在拆卸窗口中看到的内容。例如:
00DC4095 mov eax,dword ptr [i]
00DC4098 add eax,1
00DC409B mov dword ptr [i],eax
在00DC409B断点并转储eax
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 此代码是否违反一个定义规则
- 是否需要删除包含对象的"pair"?
- 是否可以从int转换为enum类类型
- 无论条件是否为true,if总是在c++中执行
- 如何找到大小'x'数组是否完全填充,在C++?
- 检查值是否在集合p1和p2中,但不在p3中
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- Visual Studio 是否允许您在数组的边界之外访问?(VS2013)
- 是否允许类模板的函数签名模板参数中使用未展开的参数包?(可能的VS2013错误)
- VS2010调试器无法在监视窗口中正确跟踪变量,VS2013是否仍然存在此错误?
- VS2013是否使用与VS2012相同的C运行时(例如,msvcr110)