Visual Studio调试模式下的行高亮显示

4
当我在调试代码时,通常情况下 Visual Studio 调试器会以黄色背景突出显示正在调试的行。以下是截图: enter image description here
但是,在某些情况下,被调试的行会以橙色背景突出显示。以下是截图: enter image description here
此外,有时当我按下 F10 按钮时,代码行的背景从黄色变为橙色,反之亦然。这些更改背后的模式是什么?
注意: 我想知道这是否与我的程序有两个分别运行在后台的线程有关?

1
它或许是橙色的,因为它是黄色(当前执行行)和红色(断点)的组合吗? - David
2
当你有多个线程运行时,就会出现橙色。 - Matt Rowland
我认为这与winforms无关。如果您能用VS的版本替换winforms标签,那就太好了,因为着色很可能取决于版本。 - Breeze
1个回答

11

我想知道这是否与我的程序有两个独立的线程有关

是的,非常有关。橙色背景颜色意味着出现了线程上下文切换,并且您不再调试之前查看的线程。请注意箭头上的蓝色感叹号叠加,它是一个额外的警告。

以下是一些示例代码,可以使它变得更加清晰易懂:

using System;
using System.Threading;

class Program {
    static void Main(string[] args) {
        new Thread(Example).Start();
        new Thread(Example).Start();
        Console.ReadLine();
    }

    static void Example() {
        var rng = new Random(Thread.CurrentThread.ManagedThreadId);
        for (int loop = 0; loop < 10000; ++loop) {
            Thread.Sleep(rng.Next(0, 100));
            Thread.Sleep(rng.Next(0, 100));
            Thread.Sleep(rng.Next(0, 100));
            Thread.Sleep(rng.Next(0, 100));
            Thread.Sleep(rng.Next(0, 100));
            Thread.Sleep(rng.Next(0, 100));
            Thread.Sleep(rng.Next(0, 100));
        }
    }
}

在Thread.Sleep()的其中一个调用上设置断点。按F5键,执行将在断点处停止。背景是黄色的。使用Debug>Windows>Threads,在当前线程上注意到黄色箭头。

现在按F10键。

可能会发生以下三种情况之一,结果完全随机:

  • 您可以在同一线程中跳转到下一个语句。
  • 第二个线程也可能触发断点。
  • 第二个线程可能首先落在某个语句并触发调试器断点。

还要观察“Threads”调试器窗口中的黄色标记。在第一条信息中,该标记未移动,同一线程激活了断点。背景颜色是黄色。如果标记移动了,即与最后2条信息匹配,则背景颜色为橙色

重复按F10以获取所有可能的结果。请注意,背景颜色的选择与当前线程是否在“Threads”窗口中更改完全匹配。第三条信息是此示例程序中最有可能的结果。

下一个实验应该尝试右键单击“Threads”窗口中的其他线程,然后选择“Freeze”。现在按F10键始终触发相同的线程,突出显示始终为黄色。当调试线程变得太困难时需要做的一种操作。

长话短说,知道您正在调试不同的线程相当重要。本地变量和堆栈跟踪可能会有很大的区别。橙色背景和蓝色感叹号警告您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接