1

Wenn ich meinen Code debuggen, wird in den meisten Fällen die Debugging-Zeile (von Visual Studio-Debugger) mit dem gelben Hintergrund hervorgehoben. Hier ist der Screenshot: enter image description hereVisual Studio Linie Highlight im Debug-Modus

Aber in einigen Fällen die gedebuggt Linie mit orange Hintergrund hervorgehoben: Hier ist der Screenshot: enter image description here

, auch manchmal, wenn ich gepresste F10 Taste, um die Codezeile Hintergrund wechselte von gelb zu Orange und umgekehrt. Was ist das Muster hinter diesen Veränderungen?

PS - Ich frage mich, ob dies irgendwie damit zu tun hat, dass mein Programm zwei separate Threads hat, die im Hintergrund ausgeführt werden?

+1

Ist es vielleicht orange, weil es eine Kombination von gelb (aktuelle ausführende Linie) und rot (Haltepunkt) ist? – David

+1

Die Orange ist, wenn mehrere Threads ausgeführt werden. –

+0

Ich glaube nicht, dass dies Winforms betrifft. Es wäre toll, wenn Sie das Winforms-Tag durch die Version von VS ersetzen könnten, da die Färbung sehr wahrscheinlich von der Version abhängt – Breeze

Antwort

5

Ich frage mich, ob das irgendwie mit der Tatsache verbunden ist, dass mein Programm hat zwei separate Threads

Ja, sehr. Die orangefarbene Hintergrundfarbe soll Sie warnen, dass ein Threadkontextwechsel stattgefunden hat und Sie den Thread, den Sie vorher angeschaut haben, nicht mehr debuggen. Beachten Sie das blaue Ausrufezeichen auf dem Pfeil, eine zusätzliche Warnung.

Einige Codebeispiel, das es kristallklar macht:

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)); 
     } 
    } 
} 

einen Haltepunkt auf einen der Thread.Sleep() aufruft. Drücken Sie F5 und die Ausführung stoppt am Haltepunkt. Der Hintergrund ist gelb. Verwenden Sie Debug> Windows> Threads, beachten Sie den gelben Pfeil auf dem aktuellen Thread.

Drücken Sie jetzt F10.

Einer der drei Dinge können passieren, ist das Ergebnis völlig zufällig:

  • Sie treten an die nächste Anweisung im selben Thread.
  • Der zweite Thread könnte auch den Breakpoint treffen.
  • Der zweite Thread ist möglicherweise der erste, der auf einer Anweisung landet und einen Debugger-Break auslöst.

Beachten Sie auch die gelbe Markierung im Thread-Debugger-Fenster. In der ersten Kugel hat sich der Marker nicht bewegt, der gleiche Thread hat den Bruch aktiviert. Die Hintergrundfarbe ist gelb. Wenn sich der Marker bewegt hat und somit die letzten 2 Kugeln übereinstimmen, ist die Hintergrundfarbe orange.

Drücken Sie wiederholt F10, um alle möglichen Ergebnisse zu erhalten. Beachten Sie, dass die Auswahl der Hintergrundfarbe exakt mit der Änderung des aktuellen Threads im Thread-Fenster übereinstimmt. Der dritte Punkt ist das wahrscheinlichste Ergebnis in diesem Beispielprogramm.

Das nächste Experiment, das Sie ausprobieren sollten, ist mit der rechten Maustaste auf den anderen Thread im Thread-Fenster und wählen Sie Freeze. Durch Drücken von F10 wird nun immer der gleiche Thread angetippt und die Hervorhebung ist immer gelb. Die Art von Dingen, die Sie tun müssen, wenn Sie Threads debuggen, wird zu schwierig.

Lange Rede, kurzer Sinn, das Wissen, dass Sie einen anderen Thread debuggen, ist ziemlich wichtig. Lokale Variablen und Stack-Trace können sehr unterschiedlich sein.Der orange Hintergrund und der blaue Ausruf warnen dich davor.

Verwandte Themen