2009-06-12 9 views
75

Ich bin in der Lage, um den Debugger zu brechen, wenn es eine bestimmte Zeichenfolge Übereinstimmung erreicht. Als Beispiel könnte ich so etwas wie dieses:Wie wird ein bedingter Haltepunkt in Xcode basierend auf einer Objekt-String-Eigenschaft festgelegt?

Foo myObj = [self gimmeObj]; 

myObj könnte eine Eigenschaft name genannt haben. Ich möchte der Debugger auf die Zuordnung zu stoppen, wenn

[myObj.name isEqualToString:@"Bar"]; 

Wie kann ich meine bedingten Haltepunkt in Xcode gesetzt, das zu tun?

Antwort

159

Sie können einen bedingten Haltepunkt in Xcode festlegen, indem Sie den Haltepunkt normal setzen, dann bei gedrückter Ctrl-Taste darauf klicken und Haltepunkt bearbeiten auswählen (wählen Sie Ausführen -> Anzeigen -> Haltepunkte).

Im Breakpoint-Eintrag gibt es eine Condition-Spalte.

Nun, es gibt mehrere Probleme für die Bedingung zu beachten. Erstens versteht gdb die Punktsyntax nicht, also müssen Sie anstelle von myObj.name [myObj name] verwenden (es sei denn, der Name ist ein ivar).

Als nächstes müssen Sie, wie bei den meisten Ausdrücken in gdb, den Typ des Rückgabeergebnisses angeben, nämlich "BOOL". So eine Bedingung wie:

(BOOL)[[myObj name] isEqualToString:@"Bar"] 

Oft ist es tatsächlich einfacher, nur dies, indem vorübergehend in Code zu tun Hinzufügen von Code wie:

if ([myObj.name isEqualToString:@"Bar"]) { 
    NSLog(@"here"); 
} 

und dann auf der NSLog den Haltepunkt zu setzen. Dann kann Ihr Zustand beliebig komplex sein, ohne sich darum kümmern zu müssen, was gdb parsen kann und was nicht.

+11

durch Ändern Sie den Code Sie das Risiko des Vergessens Abgesehen davon, dass zu ändern führen Sie Ihre Protokollierung zu entfernen oder das Verhalten zu verändern –

+3

das wahr ist. Ich löse dies oft ab, indem ich "NYI" (noch nicht implementiert) in die Zeichenfolge einfüge, und dann wird meine Suche nach NYI vor der Veröffentlichung nachsehen. –

+3

Irgendwelche Hinweise darüber, wie das in lldb funktioniert? – bentford

6

Ich bin mir nicht sicher, ob dies funktionieren wird, aber Sie können versuchen, einen Haltepunkt in dieser Zeile Code einstellen, öffnen Sie den Debugger-Konsole (Cmd + Shift + R) und geben

condition N (int)[[myObj name] isEqualToString:@"Bar"] 

Wo N wird durch die Nummer des Haltepunkts (eine Ganzzahl) ersetzt.

2

Wenn Sie myObj.name mithilfe des Setter-Objekts mutieren, können Sie einen symbolischen Haltepunkt unter -[MyObjClass setName:] entweder über die Debugger-Konsole oder über das Menü Ausführen-> Abhängigkeiten verwalten-> Symbolischen Haltepunkt hinzufügen in Xcode hinzufügen. Wenn nicht (warum nicht? Sie sollten die Instanzvariable wahrscheinlich nicht direkt ändern, außer im angegebenen Initialisierer oder Dealloc), können Sie einen Watchpoint in gdb setzen (verwenden Sie die Debugger-Konsole in Xcode, sobald der Debugger ausgeführt wird). This Seite erklärt wie. Ich glaube nicht, dass Xcode eine Benutzeroberfläche zum Einstellen von Watchpoints ohne Verwendung der Debugger-Konsole verfügbar macht.

0

Manchmal bei der Arbeit mit Frameworks (Debug-Builds) und müssen einen Haltepunkt in bestimmten Datei/Ort, die schwer zu navigieren ist oder öffentlich in Framework in der Entwicklung. Eine Option besteht darin, eine Hilfsklasse zum Auslösen bedingter Haltepunkte zu schreiben. & erleichtert das Ausführen von Step-In/Step-Out.

- (void)invokeFrameworkMethod { 
    ... 
    [DebugConditionalBreakPointHelper breakPointCondition:YES comment:@"from invokeFrameworkMethod."]; 
    ... 
} 

Header-Deklaration im Rahmen der Entwicklung.

#import <Foundation/Foundation.h> 

@interface DebugConditionalBreakPointHelper : NSObject 
+ (void)breakPointCondition:(BOOL)enabled comment:(NSString *)comment; 
@end 

Und Implementierungsdatei:

#import "DebugConditionalBreakPointHelper.h" 

@implementation DebugConditionalBreakPointHelper 
+ (void)breakPointCondition:(BOOL)enabled comment:(NSString *)comment { 
    if (enabled) 
    { 
     NSLog(@"Triggerred Conditional Break Point. Comment: %@"); 
    } 
} 
@end 
4

Hier ist, wie Sie XCode LLDB bedingte Haltepunkte Sie verwenden.

Doppelklicken Sie zuerst auf den Unterbrechungspunkt (oder klicken Sie mit der rechten Maustaste auf edit breakpoint), Sie können ein Dialogfenster sehen.

enter image description here

Hier ist, was jene Option bedeutet:

  1. Zustand: Der Haltepunkt wird nur Feuer unter dieser Bedingung.
  2. Ignorieren: Die Höhe der Zeit die Bedingung vor Feuer zu erfüllen braucht die Haltepunkt
  3. Aktion: Aktion, die nach den Unterbrechungspausen läuft.
  4. Optionen: Automatisch weiter nach Evaluierung der Maßnahmen

Hier ist eine Zusammenfassung. Für das obige Beispiel in Bild bedeutet dies, dass, wenn die Variable buildingId gleich 13 ist, hier brechen. Wenn ich die Ignorierzeit zu 1 addiere, ignoriert es das erste Mal, wenn buildingId gleich 13 ist und zum zweiten Mal bricht, wenn die Bedingung erfüllt ist.

Bei Aktionen, wenn Sie Aktionen hinzufügen drücken, wird eine Auswahlliste angezeigt. Normalerweise verwende ich die Debugger Commandpo, um Variablen zu drucken, die ich überprüfen muss, und ich glaube, dass es bessere Möglichkeiten gibt, die Aktionen zu verwenden, als ich es tue.

Es scheint, dass Sie die App neu kompilieren und ausführen, wenn Sie die Bedingungen zur Laufzeit

+0

Darf ich bitte den Grund für den Downvote fragen ? – nuynait

+0

Wahrscheinlich, weil die Frage war, auf einem String-Wert auf Haltepunkt zu stoppen [Ich war nicht der Down-Voter] –

Verwandte Themen