Możesz ustawić warunkowy punkt przerwania w Xcode, ustawiając go normalnie, a następnie kliknij go z wciśniętym klawiszem Control i wybierz Edytuj punkt przerwania (wybierz Uruchom -> Pokaż -> Punkty przerwania).
We wpisie punktu przerwania znajduje się kolumna Warunek.
W przypadku tego stanu należy pamiętać o kilku kwestiach. Po pierwsze, gdb nie rozumie składni kropek, więc zamiast myObj.name, musisz użyć [myObj name] (chyba że nazwa jest ivar).
Następnie, tak jak w przypadku większości wyrażeń w gdb, musisz podać typ zwracanego wyniku, a mianowicie „BOOL”. Ustaw więc warunek taki jak:
(BOOL)[[myObj name] isEqualToString:@"Bar"]
Często łatwiej jest po prostu zrobić to w kodzie, tymczasowo dodając kod taki jak:
if ( [myObj.name isEqualToString:@"Bar"] ) {
NSLog( @"here" );
}
a następnie ustawianie punktu przerwania w dzienniku NSLog. Wtedy twój stan może być dowolnie złożony, bez martwienia się o to, co gdb może, a czego nie może przeanalizować.
Oto jak to zrobić za pomocą warunkowych punktów przerwania XCode lldb.
Najpierw kliknij dwukrotnie punkt przerwania (lub kliknij prawym przyciskiem myszy
edit breakpoint
), pojawi się okno dialogowe.Oto, co oznaczają te opcje:
Oto podsumowanie. Dla powyższego przykładu na obrazku oznacza to, że gdy zmienna
buildingId
jest równa 13, przerwij tutaj. Jeśli dodam czas ignorowania do 1, zignoruje on za pierwszym razem, gdybuildingId
jest równy 13 i zerwie za drugim razem, gdy warunek zostanie spełniony.W przypadku działań po naciśnięciu przycisku dodaj działania pojawi się lista do wyboru. Zwykle to, co robię, to
Debugger Command
po
wypisywanie zmiennych, które muszę sprawdzić i uważam, że są lepsze sposoby wykorzystania akcji niż ja.Wygląda na to, że musisz ponownie skompilować i uruchomić aplikację, jeśli zmienisz warunki w czasie wykonywania
źródło
Nie jestem pewien, czy to zadziała, ale możesz spróbować ustawić punkt przerwania w tym wierszu kodu, otworzyć konsolę debugera (Cmd + Shift + R) i wpisać
condition N (int)[[myObj name] isEqualToString:@"Bar"]
Gdzie N jest zamieniane na numer punktu przerwania (liczba całkowita).
źródło
Jeśli zmutujesz myObj.name przy użyciu metody ustawiającej, możesz dodać symboliczny punkt przerwania w
-[MyObjClass setName:]
konsoli debugera lub z menu Uruchom-> Zarządzaj punktami przerwania- > Dodaj symboliczny punkt przerwania w Xcode. Jeśli nie (dlaczego nie? Prawdopodobnie nie powinieneś modyfikować zmiennej instancji bezpośrednio, z wyjątkiem wyznaczonego inicjatora lub dealloc), możesz ustawić punkt obserwacyjny w gdb (użyj konsoli debugera w Xcode po uruchomieniu debugera). Ta strona wyjaśnia, jak to zrobić. Nie wierzę, że Xcode udostępnia interfejs użytkownika do ustawiania punktów obserwacyjnych bez korzystania z konsoli debugera.źródło
Czasami podczas pracy z platformami (kompilacje debugowania) i trzeba umieścić punkt przerwania w pewnym pliku / lokalizacji, w którym trudno jest nawigować lub nie jest on publicznie ujawniany w ramach opracowywanej platformy. Jedną z opcji jest napisanie klasy pomocniczej, która wyzwala warunkowe punkty przerwania i ułatwia wchodzenie / wychodzenie.
- (void)invokeFrameworkMethod { ... [DebugConditionalBreakPointHelper breakPointCondition:YES comment:@"from invokeFrameworkMethod."]; ... }
Deklaracja nagłówka w ramach opracowywanych.
#import <Foundation/Foundation.h> @interface DebugConditionalBreakPointHelper : NSObject + (void)breakPointCondition:(BOOL)enabled comment:(NSString *)comment; @end
I plik wdrożeniowy:
#import "DebugConditionalBreakPointHelper.h" @implementation DebugConditionalBreakPointHelper + (void)breakPointCondition:(BOOL)enabled comment:(NSString *)comment { if (enabled) { NSLog(@"Triggerred Conditional Break Point. Comment: %@"); } } @end
źródło