Breakpoints

Bedinge Haltepunkte (engl.: Breakpoints) sind eine tolle Erfindung. Während ein einfacher Haltepunkt generell an Punkt A stoppt, muss bei einem bedingten Haltepunkt eine – der Name sagt es – Bedingung erfüllt sein. So auch in Visual Studio. Dazu wird, ähnlich wie bei einer if-Abfrage, eine Bedingung festgelegt, die z.B. lauten kann: x >= 10. Das reicht aus, um das Programm nur dann zu stoppen, wenn x einen entsprechenden Wert angenommen hat. Im anderen Fall passiert nichts.

Im Allgemeinen ist dies eine sehr praktische Funktion, vor allem, da die Bedingung zur Laufzeit angepasst werden kann. Der große Nachteil ist jedoch, dass bei rechenintensiven Schleifeninhalten, wie sie beispielsweise in der Bildbearbeitung häufig auftreten, die Rechenzeit um ein Vielfaches ansteigt. Natürlich kann der Anfangswert der Schleife erhöht werden, was jedoch nicht immer möglich ist.

Um diese Problematik zu umgehen, gibt es einen einfachen Trick: die Bedingung wird nicht für den Haltepunkt, sondern innerhalb des Codes festgelegt. Ein Beispiel ist im Quellcode unterhalb dieses Absatzes dargestellt. Die Bedingung aus dem Haltepunkt wird entfernt und stattdessen in einer typischen if-Abfrage im Quellcode implementiert. Zusätzlich wird ein einfacher Haltepunkt auf die zugehörige Anweisung im Rumpf gesetzt. Die Bedingung wird in diesem Fall durch den Kompiliervorgang weitestgehend optimiert und trägt somit zu einem Geschwindigkeitsgewinn bei. In einem Test (Bearbeitung eines Bildes) konnte die Zeit bis zum Erreichen des Haltepunktes von über 5 Minuten auf unter 1 Sekunde reduziert werden!

// viele Schleifendurchgänge
for(int x = 0; x < 10000; x++)
{
   for(int y = 0; y < 10000; y++)
   {
      if( 5000 < x  && 5000 < y)
      {
         int a = 0; // Hier einfachen Breakpoint setzen
      }

      // Anweisungen...
   }
}

Der sich aus dieser Herangehensweise resultierende Nachteil, dass man dadurch eine statische Bedingung hat und das Programm jedes Mal neu kompilieren muss, kann ebenfalls leicht umgangen werden. Dazu werden die Werte aus der Bedingung in Variablen gespeichert (Beispiel unter dem Absatz). Während der Programmausführung kann man nun den Cursor über die gewünschte Variable bewegen und den Inhalt anpassen (Wichtig: das Programm muss durch einen Haltepunkt gestoppt sein um Variablen zu ändern). Somit kann ohne Kompilieren die Bedingung geändert werden.

int iStopX = 750;
int iStopY = 750;

// viele Schleifendurchgänge
for(int x = 0; x < 10000; x++)
{
   for(int y = 0; y < 10000; y++)
   {
      if(x > iStopX && y > iStopY)
      {
         int a = 0; // Hier einfachen Breakpoint setzen
      }

      // Anweisungen...
   }
}

Hat man den Fehler (oder was immer man gesucht hat) gefunden, kann die if-Abfrage natürlich wieder entfernt werden.

 


Teile diesen Beitrag

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert