Visual Studio行在调试模式下突出显示

alt*_*3en 1 c# debugging visual-studio-2010 visual-studio visual-studio-2012

当我调试我的代码时,在大多数情况下,调试行会突出显示(通过Visual Studio调试器)黄色背景.这是截图: 在此输入图像描述

但是,在某些情况下,调试行以橙色背景突出显示:这是截图: 在此输入图像描述

此外,有时当我按下F10按钮时,代码行背景从黄色变为橙色,反之亦然.这些变化背后的模式是什么?

PS - 我想知道这是否与我的程序有两个在后台运行的独立线程有关?

Han*_*ant 5

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

是的,非常如此.橙色背景颜色用于警告您发生了线程上下文切换,并且您不再调试先前查看过的线程.请注意箭头上的蓝色感叹号覆盖,这是一个额外的警告.

一些示例代码使其清晰:

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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

现在按F10.

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

  • 您跳到同一个线程中的下一个语句.
  • 第二个线程也可能会遇到断点.
  • 第二个线程可能是第一个登陆语句并触发调试器中断的线程.

还要观察Threads调试器窗口中的黄色标记.在标记未移动的第一个项目中,同一个线程激活了中断.背景颜色为黄色.如果标记确实移动,从而匹配最后2个子弹,则背景颜色为橙色.

反复按F10以获得所有可能的结果.请注意,背景颜色选择与"线程"窗口中当前线程是否更改完全匹配.第三个项目符号是此示例程序中最有可能的结果.

您应该尝试的下一个实验是右键单击Threads窗口中的另一个线程并选择Freeze.现在按F10始终按下相同的线程,突出显示始终为黄色.调试线程时需要做的事情变得非常困难.

长话短说,知道你正在调试一个不同的线程是非常重要的.局部变量和堆栈跟踪可能完全不同.橙色背景和蓝色感叹号警告你.