【发布时间】:2015-08-26 21:46:48
【问题描述】:
我现在已经直接向微软here、here 和here 提出了这个问题。显然问题仍然出现在 VS2015 的当前 RC 中(参见上面的第二个链接)。
在 Visual Studio 2013 中,可以使用诸如 p,10000 之类的监视来查看 C 数组的多个元素(例如,其中 p 是双 *)。
在下面的示例中,我显示了在监视窗口中看到的此类数组的一部分的屏幕截图,以及将 CTRL-C 复制并 CTRL-V 粘贴到文本编辑器中的数组的同一部分。请注意,从元素 25 开始,复制/粘贴的值与监视窗口中的值不一致(这是正确的)。
[20] 1.0945579725021715 double
[21] 0.99979213435791758 double
[22] 1.0971002689671798 double
[23] 0.99977802981060826 double
[24] 1.1002739126009620 double
[25] 0.99964664435140704 double
[26] 1.1054689877466559 double
[27] 0.99963245464284955 double
[28] 1.1002149405804762 double
[29] 0.99961125488418856 double
[30] 1.0956742333763470 double
到目前为止,在我的实验中,我倾向于看到前几个值和最后几个值被正确复制,而数组的中间部分不正确。它并不总是出错。通常它适用于检查的第一个阵列,但对于随后的阵列会出错。此外,当它出错时,似乎第二次复制/粘贴值有时会导致正确的结果。看起来不正确的数字通常是数组某些元素的先前值 - 复制到剪贴板的是数组当前和先前内容的混合。我看到的数组有 2000 多个元素。
这暗示了在 Visual Studio 的复制到剪贴板的实现中使用的数据的错误无效(即有时仅部分更新)副本。我的实验强烈表明,当且仅当这些元素(或足够“附近”的元素 - 似乎可能涉及“分页块大小”)已显示在屏幕上时,才会更新呈现到剪贴板的数据副本中的元素.特别是一次滚动一个页面的数组似乎会导致复制正常工作,同时使用 HOME 和 END 键从数组顶部轻弹到它的底部不会导致数组的中间部分被更新然后被渲染到剪贴板的副本。
确实,如果在同一个数组上设置多个watch,就可以得到多个答案,例如这是命中同一个断点3次后复制到剪贴板的数据。第一次命中断点时,我复制了所有数据,所有数据都被正确复制到剪贴板。第二次是零散的。至关重要的是,我随后向下滚动了大约 25% 的监视窗口,足以将黄色数据注入到剪贴板上的内容中。然后我返回到监视窗口的开头并继续执行,直到第三次命中断点。然后我选择了监视窗口中的所有数据并使用 CTRL-A CTRL-C 复制它。结果是粉红色的数据是从第一次命中断点开始的。黄色的数据来自第二次,未突出显示的数据实际上是正确的。请注意,粉红色数据的元素 0 和 1 甚至与它们上方的数组摘要不一致!为简洁起见,我省略了元素 2-497 和 503-997。
从 6 开始使用各种 VC++ 版本,我以前没有见过这种行为,也无法立即在网络上找到对它的引用。
如果一个人在调试复杂的东西时依赖此功能,那么在意识到自己被误导之前,可能会挠头想知道奇怪的数字很长时间。
我正在使用 Microsoft Visual Studio Professional 2013,版本 12.0.31101.00 更新 4。
有其他人看到过这个吗?有没有人知道更多关于它或知道修复或解决方法?
【问题讨论】:
标签: c++ arrays visual-studio-2013 clipboard watch