2009-06-12 12 views

Odpowiedz

159

Możesz ustawić warunkowy punkt przerwania w Xcode, ustawiając punkt przerwania w sposób normalny, następnie kliknij go i przytrzymaj klawiszem Control i wybierz Edit Breakpoint (wybierz Run -> Show -> Breakpoints).

W pozycji punktu przerwania znajduje się kolumna Warunek.

Jest kilka kwestii, o których należy pamiętać. Po pierwsze, gdb nie rozumie składni dot, więc zamiast myObj.name, musisz użyć [myObj name] (chyba że name to ivar).

Następnie, podobnie jak w przypadku większości wyrażeń w gdb, należy podać typ wyniku zwracanego, a mianowicie "BOOL". Tak ustawić STAN:

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

Często jest to rzeczywiście łatwiej jest po prostu zrobić to w kodzie poprzez tymczasowe dodanie kodu jak:

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

a następnie ustawienie punktu przerwania na NSLog. Wtedy twój stan może być dowolnie złożony, nie martwiąc się o to, co gdb może i nie może zanalizować.

+11

Tyle że zmieniając swój kod pojawia się ryzyko zapominania aby usunąć rejestrację lub zmianę zachowania –

+3

to prawda. Często złagodzę to przez dodanie "NYI" (jeszcze nie zaimplementowałem) do napisu, a następnie moje wyszukiwanie przed wydaniem sprawdzenia dla NYI go złapie. –

+3

Jakieś wskazówki o tym, jak to działa w lldb? – bentford

6

Nie jestem pewien, czy to będzie działać, ale można spróbować ustawić punkt przerwania na tej linii kodu, otwórz konsolę debuggera (Cmd + Shift + R) i wpisz

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

Gdzie N jest zastępowane przez numer punktu przerwania (liczbę całkowitą).

2

Jeśli zmutujesz myObj.name za pomocą ustawiacza, możesz dodać symboliczny punkt przerwania na -[MyObjClass setName:] albo z konsoli Debugger lub z menu Run-> Manage Breakpoints-> Add Symbolic Breakpoint w Xcode. Jeśli nie (prawdopodobnie nie powinieneś modyfikować bezpośrednio instancji zmiennej, z wyjątkiem wyznaczonego inicjalizatora lub dealloc), możesz ustawić punkt obserwacyjny w gdb (użyj Debugger Console w Xcode po uruchomieniu debuggera). This strona wyjaśnia, w jaki sposób. Nie wierzę, że Xcode udostępnia interfejs użytkownika do ustawiania punktów obserwacyjnych bez użycia Debugger Console.

0

W czasie pracy z frameworkiem (kompilacje debugowania) i konieczności umieszczenia punktu przerwania w określonym pliku/lokalizacji, który jest trudny w nawigacji lub nie jest publicznie udostępniany w ramach opracowywanej platformy. Jedną z opcji jest napisanie klasy pomocnika, która wyzwala warunkowe punkty przerwania, ułatwiając wejście/wyjście.

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

Deklaracja nagłówka w ramach będących w trakcie opracowywania.

#import <Foundation/Foundation.h> 

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

i wdrażania pliku:

#import "DebugConditionalBreakPointHelper.h" 

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

Oto jak to zrobić przy użyciu XCode lldb punkty przerwania warunkowy.

Najpierw kliknij dwukrotnie punkt przerwania (lub kliknij prawym przyciskiem myszy edit breakpoint), pojawi się okno dialogowe z oknem dialogowym.

enter image description here

Oto co oznaczają te opcja:

  1. Stan: The przerwania ognia będzie tylko pod tym warunkiem.
  2. Ignoruj ​​: ile razy warunek musi spełnić przed ogniem breakpoint
  3. działania: Akcja, która biegnie po przerwach przerwania.
  4. Opcje: automatycznie kontynuowane po działań oceniających

Oto podsumowanie. Dla powyższego przykładu na obrazie oznacza to, że gdy zmienna buildingId ma wartość 13, włam się tutaj. Jeśli dodaję czas ignorowania do 1, to zignoruje to po raz pierwszy, gdy buildingId będzie równe 13 i przerwie się po drugim spełnieniu warunku.

W przypadku działań, po naciśnięciu Dodaj działania, pojawi się lista wyboru. Zwykle używam Debugger Command do drukowania zmiennych, które muszę sprawdzić, i wierzę, że istnieją lepsze sposoby, używając działań, które wykonuję.

Wydaje się, że trzeba skompilować i uruchomić aplikację w przypadku zmiany warunków w czasie wykonywania

+0

Czy mogę zapytać o przyczynę spadku? ? – nuynait

+0

Prawdopodobnie dlatego, że pytanie dotyczyło zatrzymywania się w punkcie przerwania w oparciu o wartość ciągu [nie byłem tym, który odrzucił] –

Powiązane problemy