c++ - Visual Studio 2013 C++ 监 window 口 : arrays copy incorrectly to clipboard

标签 c++ arrays visual-studio-2013 clipboard watch

我现在已经直接向微软提出了这个问题here , herehere .显然,该问题在 VS2015 的当前 RC 中仍然存在(请参阅上面的第二个链接)。

在 Visual Studio 2013 中,可以使用类似 p,10000 的 watch 查看 C 数组的多个元素(例如,其中 p 是 double *)。

在下面的示例中,我展示了在监 window 口中看到的此类数组的一部分的屏幕截图,以及与 CTRL-C 复制和 CTRL-V 粘贴到文本编辑器中的数组相同的部分。请注意,从元素 25 开始,复制/粘贴的值与监 window 口中的值不一致(正确)。

Watch window

    [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 复制到剪贴板的实现中使用了数据的错误无效(即有时仅部分更新)拷贝。我的实验强烈建议,当且仅当这些元素(或足够“附近”的元素——看起来可能涉及“分页 block 大小”)已显示在屏幕上时,才会更新呈现到剪贴板的数据拷贝中的元素.特别是一次滚动一页数组似乎会导致复制正常工作,而使用 HOME 和 END 键从数组顶部轻弹到底部不会导致数组的中间部分被更新然后呈现到剪贴板的拷贝。

事实上,如果在同一个数组上设置多个 watch ,则可以获得多个答案,例如,这是在 3 次击中同一断点后复制到剪贴板的数据。第一次遇到断点时,我复制了所有数据,并将其全部正确复制到剪贴板。第二次是不完整的。至关重要的是,我随后向下滚动了大约 25% 的观察窗口,足以将黄色数据注入(inject)到剪贴板上最终出现的内容中。然后我返回到监 window 口的开头并继续执行,直到第三次命中断点为止。然后我选择了监 window 口中的所有数据并使用 CTRL-A CTRL-C 复制它。结果是粉红色的数据来自第一次命中断点。黄色的数据是第二次的,没有高亮的数据其实是正确的。请注意,粉红色数据的元素 0 和 1 甚至与它们上方的数组摘要不一致!为简洁起见,我省略了元素 2-497 和 503-997。

Multiple watches

从 6 开始使用了各种 VC++ 版本,我以前从未见过这种行为,也无法立即在网上找到对它的引用。

如果在调试复杂的东西时依赖于此功能,那么在意识到自己被误导之前,可能会挠头想知道很久以来的奇怪数字。

我使用的是 Microsoft Visual Studio Professional 2013,版本 12.0.31101.00 Update 4。

有没有其他人看到过这个,有没有人对此有更多了解或知道修复或解决方法?

最佳答案

各个同事也看到了这一点。显然它也会影响 Visual Studio 2015 版本。

在我撰写本文时,Microsoft 显然已经接受了错误报告并重现了该问题,但尚未指明修复的时间表或计划。

一种解决方法是在复制之前滚动查看希望复制的监 window 口中的所有数据。看似显示的内容已更新,但未显示的内容在复制数据时不一定是最新的。

更新(2018 年 2 月)

下面的简单重现现在可以在 Visual Studio 2017 中正常运行。所以看起来错误已修复,尽管复制阶段需要很长时间,并且在剪贴板上创建 10000 行文本时会出现一个弹出窗口。在 Visual Studio 2010(包括 Visual Studio 2010)之前,它快得多(并且工作正常)。

观察a 并展开它。 Ctrl-A, Ctrl-C 表示选择并复制监 window 口中的所有内容。

int a[10000];
for (int i=0; i<10000; ++i)
    a[i] = i;

(void)a[0]; // breakpoint here, Ctrl-A, Ctrl-C, paste somewhere

for (int i=0; i<10000; ++i)
    a[i] += 100;

(void)a[0]; // breakpoint here, Ctrl-A, Ctrl-C, paste somewhere

Visual Studio 2013 和 2015 会给你这样的东西

-       a   0x00ef5af4 {100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, ...}  int[10000]
        [0] 100 int
        [1] 101 int
        [2] 102 int
        [3] 103 int
        [4] 104 int
        [5] 105 int
        [6] 106 int
        [7] 107 int
        [8] 108 int
        [9] 109 int
        [10]    110 int
        [11]    11  int // Oops. The line it goes wrong on depends
        [12]    12  int // on the number of visible lines in the
        [13]    13  int // watch window.
...

关于c++ - Visual Studio 2013 C++ 监 window 口 : arrays copy incorrectly to clipboard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30776706/

相关文章:

arrays - 在 EXCEL 中使用多个表的条件求和

c++ - 如何诊断 Windows 上的堆损坏错误?

visual-studio-2013 - Visual Studio : Prevent DOM Explorer from opening when debugging Windows Store app

c++ - 我们什么时候需要定义析构函数?

c++ - 有没有办法用 cgicc 提取自定义请求 header

javascript - 如何使用forEach循环javascript对对象数组进行排序

c++ - 在对象指针数组上调用函数

c++ - 如何设置从 CreateProcess 创建的进程的入口点

c++ - csv 文件到带换行符的二维数组 cpp

c# Resharper 'No Tests Found in Project'/'Inconclusive: Test wasn' t 运行'