2013-07-10 6 views
5

Wie zu beenden, wenn eine Bedingung in If-Anweisung erfüllt ist, beim Debuggen? Zum Beispiel:Wie zu stoppen, wenn eine Bedingung in if-Anweisung erfüllt ist, wenn Debugging

if (!check()) { 
    int a = 0; 
} 

Die int a = 0; ist Dummy-Code und dann habe ich dort einen Haltepunkt gesetzt. Wenn ich einen Haltepunkt in eine leere if-Schleife setze, stoppt der Debugger dort nicht, es stoppt nur bei Anweisungen, die es ausführen kann. Selbst wenn du int a; nur eine Erklärung wird es nicht aufhören.

Kann ich das auf andere Weise tun, als Dummy-Code zu schreiben?

Dank

+7

Was ist Ihre Plattform? Die meisten Debugger sollten in der Lage sein, einen bedingten Haltepunkt zu verwenden. – Bart

+0

"es stoppt nur bei Anweisungen, die es ausführen kann", was mich fragen lässt, ob Sie vielleicht so kompiliert wurden, dass es diese optimiert hat. – PlasmaHH

+0

Die größere Frage ist, denke ich, warum Sie eine leere if-Anweisung Körper haben? –

Antwort

10

Kann ich das auf andere Weise tun als Dummy-Code zu schreiben?

Ja!

In einem Debugger sollten Sie in der Lage sein, einen Haltepunkt hinzuzufügen und festzulegen, dass nur unterbrochen wird, wenn eine bestimmte Bedingung erfüllt ist. Wie das geht, hängt von Ihrer IDE ab, aber in meinem kann ich mit der rechten Maustaste auf den Haltepunkt im Code-Editor-Gutter oder in einem separaten Haltepunkte-Fenster klicken und Eigenschaften aus dem Popup-Menü auswählen. Dann bekomme ich diesen Dialog:

Breakpoint properties dialog with Condition set

Sie können sehen, dass ich die Eigenschaft ‚Zustand‘ festgelegt haben, die jedes Mal ausgewertet wird der Code, der Breakpoint trifft - aber der Breakpoint wird nur brechen, wenn die Bedingung ist true. Dh, wenn check()true zurückgibt, wenn alles in Ordnung ist, wird !check() es brechen, wenn check()false zurückgibt.

Dies neigt dazu, Ihr Programm etwas zu verlangsamen, wenn diese Methode eine Menge aufgerufen wird, da der Debugger normalerweise (intern) einbrechen und etwas auswerten muss, um einen solchen Ausdruck auszuwerten. Aber es ist eine ordentliche Funktionalität. Beachten Sie alle anderen Eigenschaften, die Sie auch festlegen können, und dass nicht einmal wird immer zu dem, was der Dialog sieht aus wie nach auf die Schaltfläche Erweitert klicken ...

Ihre Fragen zu beantworten:

Wenn ich setzen Breakpoint innerhalb einer leeren if-Schleife stoppt der Debugger dort nicht, es stoppt nur an Anweisungen, die es ausführen kann. Selbst wenn Sie Int a tun; nur eine Erklärung, es wird nicht aufhören.

Wenn der if-Block (keine Schleife) leer ist, dann gibt es nichts, womit er aufhören könnte. Es kann nur am tatsächlichen Code anhalten. int a; ist nur eine Variablendeklaration; Für einfache Typen wird hierfür kein Code generiert. (Es kann für komplexere Typen sein, obwohl, MyClass a; zum Beispiel, da diese den Konstruktor nennen würde.) Selbst wenn Sie ein bisschen mehr Code schreiben:

if (!check()) { 
    int a; 
    a = 5; 
    b = a; 
} 

Compiler könnte noch keinen Code für diese erzeugen, da es könnte herausfinden, dass der Code niemals wirklich etwas tut.Dies hängt in gewissem Maße von Ihren Optimierungseinstellungen ab, aber einige Compiler optimieren es sogar ohne spezielle Optimierungseinstellungen.

Manchmal kann es nützlich sein, Code zu brechen, anstatt die IDE aus verschiedenen Gründen (manchmal nur die Geschwindigkeit der Zustandsauswertung) zu verwenden. In dieser Situation tendiere ich dazu, einen Funktionsaufruf zu verwenden, da der Compiler weiß nicht, die Funktion nicht den Zustand des Programms nicht verändert und kann es nicht optimieren weg:

if (!check()) { 
    rand(); // <- breakpoint here 
} 

Aber in der Regel eine gute Nutzung Ihrer IDE und Debugger-Funktionen ist ein besserer Ansatz.

Bearbeiten: da dies upvoted wird (danke Jungs) Ich dachte, ich würde einen weiteren Ansatz hinzufügen, für die Vollständigkeit. Ein Software-/Debugger-Haltepunkt tritt mit interrupt 3, which is patched in by the debugger. auf. Die Assembleranweisung ist nur ein Byte lang, also kann über irgendeinen anderen Befehl gepatcht werden; Wenn das Programm abbricht, kann die alte Anweisung vorübergehend zurückgespielt werden. Aber genauso wie der Debugger dies on-the-fly macht, können Sie es in Code einfügen.

Mit anderen Worten, Sie können Ihr Programm zwingen, Code zu brechen (und vom Debugger abgefangen werden; wenn Sie nicht unter dem Debugger laufen, kann dies zu Problemen führen; in der Regel wird Ihr Programm abbrechen) von etwas wie diesem . Syntax hängt von Ihrer Umgebung:

if (!check()) { 
    __asm int 3 
} 

Oder noch besser, die Vermeidung umweltabhängigen Code, viele C++ Compiler haben intrinsics oder Makros, wie DebugBreak(); oder __debugbreak, die Sie wie folgt verwenden können:

if (!check()) { 
    DebugBreak(); 
} 

Wenn Sie Ihr Programm unter dem Debugger ausführen, werden Sie feststellen, dass die Ausführung in dieser Zeile unterbrochen wird.

Es gibt wenig Grund, dies normalerweise zu verwenden. Eine, die ich gesehen habe, ist ein benutzerdefinierter Asser-Handler, der beim Fehlschlagen der Assertion in den Debugger einbricht, aber die Ausführung danach erlaubt.

0

ein assertion verwenden. Es ist für Debug-Zeit Fehlerprüfung gemacht. Die Ausführung stoppt dort sofort, wenn die Bedingung falsch ist (gleich Null).

+0

Ist es nicht, wenn die Bedingung _not_ erfüllt ist? – Dahaka

+0

Hier ist auch ein gutes Beispiel: http://StackOverflow.com/Questions/253212/what-are-assertions-and-why-Would-you-use-them – Fuv

+3

Die OP schien einen _debug Break_ wollen, nicht 'abbrechen 'das Programm. –

Verwandte Themen