Freigeben über


Grundlagen des Debuggens: Haltepunkte

Aktualisiert: November 2007

Dieses Thema gilt für folgende Anwendungsbereiche:

Edition

Visual Basic

C#

C++

Web Developer

Express

Standard

Pro und Team

Tabellenlegende:

Vorhanden

Nicht vorhanden

Befehl oder Befehle, die standardmäßig ausgeblendet sind.

Ein Haltepunkt ist ein Signal, das den Debugger anweist, an einem bestimmten Punkt zeitweise die Ausführung des Programms zu unterbrechen. Wenn die Ausführung an einem Haltepunkt unterbrochen wird, befindet sich das Programm im so genannten Unterbrechungsmodus. Der Wechsel in den Unterbrechungsmodus bedeutet jedoch nicht die Beendigung der Programmausführung. Die Ausführung kann jederzeit wieder aufgenommen werden.

Sie können sich diesen Unterbrechungsmodus wie ein Timeout vorstellen. Alle Elemente bleiben erhalten, z. B. verbleiben Funktionen, Variablen und Objekte im Arbeitsspeicher, aber ihre Bewegungen und Aktivitäten werden ausgesetzt. Während des Unterbrechungsmodus können Sie ihre Positionen und Zustände untersuchen, um nach Verstößen oder Fehlern zu suchen. Während des Unterbrechungsmodus können Sie das Programm auch anpassen. Sie können beispielsweise den Wert einer Variablen ändern. Oder Sie können den Ausführungspunkt verschieben, wodurch die Anweisung verändert wird, die bei der Fortsetzung der Ausführung als nächstes ausgeführt wird. In C++,C# und Visual Basic kann im Unterbrechungsmodus mithilfe eines sehr leistungsstarken Features (Bearbeiten und Fortfahren) sogar der Code selbst bearbeitet werden.

Haltepunkte stellen ein leistungsfähiges Tool dar, mit dem Sie die Ausführung zum beliebigen Zeitpunkt und an beliebiger Stelle unterbrechen können. Somit können Sie das Programm bis zu einem bestimmten Haltepunkt ausführen, um dort mit dem Debuggen zu beginnen, und müssen den Code nicht Zeile für Zeile und Anweisung für Anweisung durchlaufen. Dadurch wird der Debugprozess erheblich beschleunigt. Ohne diese Fähigkeit wäre es praktisch unmöglich, umfangreiche Programme zu debuggen.

In vielen Programmiersprachen gibt es Anweisungen oder Konstrukte, die ein Unterbrechen der Programmausführung ermöglichen. In Visual Basic gibt es hierfür beispielsweise die Stop-Anweisung. Haltepunkte unterscheiden sich jedoch in gewisser Weise von diesen Anweisungen, da es sich bei den Haltepunkten eigentlich nicht um Quellcode handelt, der dem Programm hinzugefügt werden muss. Eine Haltepunktanweisung wird nicht in einem Quellcodefenster eingegeben. Stattdessen fordern Sie einen Haltepunkt über die Debuggerschnittstelle an, und der Debugger legt den Haltepunkt für Sie fest. Wenn Sie einen Zeilenhaltepunkt festlegen möchten, klicken Sie in den grauen Randbereich neben der entsprechenden Zeile. Komplexere Haltepunkte können über das umfassende Fenster Haltepunkte verwaltet werden.

Haltepunkte haben viele Vorteile gegenüber Debugkonstrukten, z. B. die Stop-Anweisung von Visual Basic. So können Haltepunkte gelöscht oder geändert werden, ohne dass der Quellcode des Programms geändert werden muss. Da es sich bei Haltepunkten nicht um Anweisungen handelt, erzeugen diese niemals zusätzlichen Code, wenn Sie eine Releaseversion des Programms erstellen. Wenn Sie Stop-Anweisungen in einem Programm verwenden, müssen Sie die Stop-Anweisungen manuell entfernen, bevor Sie die Releaseversion erstellen oder Bedingungsanweisungen verwenden (siehe folgendes Beispiel):

#If DEBUG Then
    Stop
#End If

Wenn Sie eine Stop-Anweisung vorübergehend deaktivieren möchten, müssen Sie die Anweisung im Quellcode suchen und auskommentieren:

 ' Stop

Dies stellt kein Problem dar, solange nur eine Stop-Anweisung vorhanden ist. Wenn Sie dagegen ein umfangreiches Programm mit vielen Stop-Anweisungen debuggen, kann das Suchen und Auskommentieren jeder einzelnen Anweisung sehr viel Zeit in Anspruch nehmen. Wenn Sie dagegen Haltepunkte verwenden, können Sie jeden einzelnen oder auch alle Haltepunkte über das Fenster Haltepunkte auswählen, aktivieren oder deaktivieren.

Ein weiterer großer Vorteil von Haltepunkten gegenüber Stop-Anweisungen ist ihre Flexibilität. Eine Stop-Anweisung bewirkt eine Unterbrechung der Ausführung in der Quellzeile, in der sich die Anweisung befindet. Sie können einen Haltepunkt mit der gleichen Funktion in einer Quellzeile festlegen. Alternativ hierzu können Sie einen Haltepunkt jedoch auch in einer Funktion oder an einer bestimmten Speicheradresse festlegen, was über eine Stop-Anweisung nicht möglich ist. Zusätzlich zu diesen Positionshaltepunkten bietet der Debugger von Visual Studio noch die so genannten Datenhaltepunkte (nur systemeigene). Ein Datenhaltepunkt wird auf einer globalen oder lokalen Variable und nicht an einer bestimmten Position im Code festgelegt. Das Festlegen eines Datenhaltepunktes bewirkt die Unterbrechung der Ausführung, wenn sich der Wert dieser Variablen ändert.

Um noch mehr Flexibilität zu gewährleisten, können Sie mit dem Debugger von Visual Studio Eigenschaften festlegen, die das Verhalten eines Haltepunkts bestimmen:

  • Über die Trefferanzahl können Sie bestimmen, beim wievielten Erreichen des Haltepunkts der Debugger die Ausführung unterbrechen soll. In der Standardeinstellung unterbricht der Debugger jedes Mal die Ausführung, wenn der Haltepunkt erreicht wird. Sie können für den Haltepunkt eine beliebige Trefferanzahl festlegen, nach der der Debugger die Ausführung unterbrechen soll (z. B. jedes zweite Mal oder jedes zehnte Mal). Das Festlegen der Trefferanzahl kann sehr hilfreich sein, denn manche Fehler treten nicht unbedingt das erste Mal auf, wenn das Programm eine bestimmte Schleife durchläuft, eine Funktion aufruft oder auf eine Variable zugreift. Manchmal taucht ein Fehler erst nach dem hundertsten oder tausendsten Durchlauf auf. Um ein solches Problem zu debuggen, müssen Sie einen Haltepunkt mit einer Trefferanzahl von 100 oder 1000 festlegen.

  • Die Bedingung ist ein Ausdruck, der angibt, ob der Haltepunkt getroffen oder übersprungen wird. Wenn der Debugger den Haltepunkt erreicht, untersucht er dessen Bedingung. Der Haltepunkt wird nur dann getroffen, wenn die entsprechende Bedingung erfüllt ist. Eine Bedingung mit einem Positionshaltepunkt kann nur dann zum Anhalten an einer bestimmten Position verwendet werden, wenn die entsprechende Bedingung zutrifft. Angenommen, Sie debuggen eine Anwendung für Bankgeschäfte, bei der beispielsweise der Kontostand niemals unter den Wert 0 sinken darf. In diesem Fall könnten Sie Haltepunkte an bestimmten Positionen im Code festlegen und bei jedem Haltepunkt eine Bedingung wie balance < 0 angeben. Sobald Sie das Programm ausführen, wird die Ausführung an diesen Positionen nur dann unterbrochen, wenn der Kontostand unter 0 liegt. Es ist möglich, Variablen und Programmzustände an der Position des ersten Haltepunktes zu untersuchen, dann die Ausführung bis zum zweiten Haltepunkt fortzusetzen usw.

  • Die Aktion gibt an, was geschehen soll, wenn der Haltepunkt erreicht wird. Standardmäßig wird die Ausführung des Debuggers unterbrochen. Sie können stattdessen aber auch eine Meldung ausgeben lassen oder ein Visual Studio-Makro ausführen. Wenn Sie eine Meldung ausgeben lassen, statt den Debugger zu unterbrechen, hat der Haltepunkt eine sehr ähnliche Wirkung wie eine Trace-Anweisung. Bei dieser Art der Verwendung werden die Haltepunkte auch als Ablaufverfolgungspunkte bezeichnet.

  • Der Filter bietet eine Möglichkeit, für den Haltepunkt einen Prozess oder einen Thread anzugeben.

    Hinweis:

    Ein besonders nützliches Verfahren stellt das Festlegen von Haltepunkten im Fenster Aufrufliste dar. Mithilfe des Fensters Aufrufliste ist es möglich, Haltepunkte für bestimmte Funktionsaufrufe festzulegen. Dies ist insbesondere dann hilfreich, wenn Sie eine rekursive Funktion debuggen, also eine Funktion, die sich selbst aufruft. Wenn die Ausführung nach einer bestimmten Anzahl von Aufrufen unterbrochen wird, können Sie im Fenster Aufrufliste einen Haltepunkt für einen vorherigen Aufruf festlegen, der noch nicht zurückgegeben wurde. Der Debugger trifft auf diesen Haltepunkt und unterbricht die Ausführung beim Verlassen der aktuellen Aufrufe.

Siehe auch

Aufgaben

Gewusst wie: Verwenden des Fenster "Haltepunkte"

Konzepte

Haltepunkte und Ablaufverfolgungspunkte

Haltepunkte und Ablaufverfolgungspunkte

Weitere Ressourcen

Debuggerwegweiser