Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper · leksjon

Avanserte feilsøkingsteknikker

Bli fortrolig med Xcode-feilsøkeren, bruddpunkter og strategier for logging for å feilsøke komplekse problemer i Objective-C-kodebaser.

Leksjon 3 av 411 trinn

Avanserte feilsøkingsteknikker er en gratis leksjon i Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper inneholder totalt 4 leksjoner.

Dypere feilsøking med Xcode

Velkommen til avansert feilsøking! Selv om grunnleggende stoppunkter er nyttige, krever komplekse problemer i eldre apper ofte mer avanserte verktøy.

Vi skal utforske kraftige funksjoner i Xcode-feilsøkeren og LLDB-kommandoer for å finne vanskelige feil, forstå programflyten og håndtere komplekse tilstander på en effektiv måte.

Stopp på betingelse

Betingede stoppunkter setter kjøringen på pause bare når en angitt betingelse er sann. Dette er perfekt for løkker eller metoder som kalles ofte, når De bare er interessert i en bestemt tilstand.

For å opprette et slikt stoppunkt høyreklikker De på et stoppunkt, velger «Edit Breakpoint» og skriver inn et Objective-C-uttrykk som i == 5.

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
  @autoreleasepool {
    for (int i = 0; i < 10; i++) {
      // Set a conditional breakpoint on this line:
      // Condition: i == 5
      NSLog(@"Loop iteration: %d", i);
    }
  }
  return 0;
}

Stoppunkt-handlinger for logging

I tillegg til å sette kjøringen på pause kan stoppunkter utføre handlinger. De kan logge meldinger, spille av lyder eller til og med kjøre feilsøkingskommandoer uten å stoppe programmet.

Dette er nyttig når De vil spore verdier eller følge programflyten uten å forstyrre kjøringen, slik at De kan forstå hva som skjer uten å måtte gå gjennom koden manuelt hele tiden.

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
  @autoreleasepool {
    for (int i = 0; i < 3; i++) { 
      NSString *message = [NSString stringWithFormat:@"Current i: %d", i];
      // Set breakpoint here with "Log Message" action:
      // Message: Current value of i is @i@
      NSLog(@"%@", message);
    }
  }
  return 0;
}

Stopp ved alle metodekall

Et symbolsk stoppunkt lar Dem sette kjøringen på pause hver gang en bestemt funksjon eller metode kalles, uavhengig av hvor den er definert i koden.

Dette er nyttig ved feilsøking av systemkall og rammeverksmetoder, eller når De ikke har tilgang til kildekoden. Angi ganske enkelt metodenavnet, for eksempel -[UIViewController viewDidLoad].

#import <Foundation/Foundation.h>

@interface MyLogger : NSObject
+ (void)logMessage:(NSString *)message;
@end

@implementation MyLogger
+ (void)logMessage:(NSString *)message {
  NSLog(@"Custom Log: %@", message);
} // Set symbolic breakpoint: +[MyLogger logMessage:]
@end

int main(int argc, const char * argv[]) {
  @autoreleasepool {
    [MyLogger logMessage:@"Application started."];
    // ... other code ...
    [MyLogger logMessage:@"Application finished."];
  }
  return 0;
}

Fange opp unntak tidlig

Unntaksstoppunkter setter programmet automatisk på pause hver gang et unntak (for eksempel NSRangeException eller NSInvalidArgumentException) kastes.

Dette hjelper Dem med å fange opp problemer der de oppstår, selv om de senere fanges opp av en @try/@catch-blokk. Dermed blir det enklere å finne den egentlige årsaken til krasj.

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
  @autoreleasepool {
    NSArray *myArray = @[@"one", @"two"];
    @try {
      // Access an out-of-bounds index
      NSString *item = myArray[2]; // This will throw an NSRangeException
      NSLog(@"Item: %@", item);
    } @catch (NSException *exception) {
      NSLog(@"Caught exception: %@", exception.reason);
    }
    NSLog(@"Program continues after catch.");
  }
  return 0;
}

Oppdage datakorrupsjon

Watchpoints (eller datastoppunkter) er et svært kraftig, avansert feilsøkingsverktøy. De setter kjøringen på pause hver gang innholdet på en bestemt minneadresse endres.

Dette er uvurderlig for å spore opp mystisk datakorrupsjon, særlig i flertrådede programmer eller kode som kan samhandle med C, der verdien til en variabel endres uventet.

#import <Foundation/Foundation.h>

@interface MyData : NSObject {
  int _value; // In Xcode, set a watchpoint on &_value after pausing
}
- (void)changeValue:(int)newValue;
@property (nonatomic, assign) int publicValue;
@end

@implementation MyData
- (instancetype)init {
  self = [super init];
  if (self) {
    _value = 0;
    _publicValue = 0;
  }
  return self;
}
- (void)changeValue:(int)newValue {
  _value = newValue; // Watchpoint on &_value would trigger here
}
@end

int main(int argc, const char * argv[]) {
  @autoreleasepool {
    MyData *data = [[MyData alloc] init];
    data.publicValue = 10; // Changes _publicValue
    [data changeValue:20];  // Changes _value
    data.publicValue = 30;
    NSLog(@"Data values changed.");
  }
  return 0;
}

Feilsøking fra kommandolinjen (LLDB)

Selv om Xcode har et godt grafisk brukergrensesnitt, er feilsøkeren underliggende LLDB (Low-Level Debugger). Når De lærer LLDB-kommandoer, får De mer presis kontroll og dypere innsikt, særlig i komplekse situasjoner.

De kan skrive LLDB-kommandoer direkte i feilsøkingskonsollen i Xcode. Det er som å ha en superkraft for å undersøke og endre programtilstanden underveis!

Viktige LLDB-kommandoer

Her er noen ofte brukte LLDB-kommandoer som kan hjelpe Dem i gang:

  • po <expression>: Print Object (viser beskrivelsen av et Objective-C-objekt).
  • p <expression>: Print (viser verdien til en primitiv type eller en C-struktur).
  • bt: Backtrace (viser kallstakken, noe som er nyttig for å forstå hvordan De kom hit).
  • v eller frame variable: Viser lokale variabler i gjeldende ramme.
  • continue: Fortsetter kjøringen av programmet.
  • next / n: Går over én kodelinje.
  • step / s: Går inn i en funksjon eller metode.
#import <Foundation/Foundation.h>

@interface Greeter : NSObject
- (NSString *)greet:(NSString *)name;
@end

@implementation Greeter
- (NSString *)greet:(NSString *)name {
  NSString *greeting = [NSString stringWithFormat:@"Hello, %@", name];
  return greeting; // Set breakpoint here, then use `po greeting` in console
}
@end

int main(int argc, const char * argv[]) {
  @autoreleasepool {
    Greeter *myGreeter = [[Greeter alloc] init];
    NSString *message = [myGreeter greet:@"Coddy"]; 
    NSLog(@"%@", message);
  }
  return 0;
}

Strukturert logging med `os_log`

For produksjonsapper og komplekse systemer kan NSLog være ineffektiv. Apple introduserte Unified Logging med os_log, som gir strukturert, effektiv og personvernbevisst logging.

Dette er avgjørende for bedriftsapper fordi det gir bedre feilsøking i release-bygg og systemomfattende logganalyse, med mer kontekst og bedre kontroll over loggene.

#import <Foundation/Foundation.h>
#import <os/log.h> // Import for os_log

os_log_t myLogger;

int main(int argc, const char * argv[]) {
  @autoreleasepool {
    myLogger = os_log_create("com.coddykit.app", "Networking");
    os_log(myLogger, "Fetching data from URL: %@", @"https://api.example.com");
    // Simulate some work
    for (int i = 0; i < 2; i++) {
      os_log_info(myLogger, "Processing item %d", i);
    }
    os_log_error(myLogger, "Network request failed with error code %d", 404);
  }
  return 0;
}

Feilsøkingsutfordring

De sporer en feil der en heltallsvariabel counter noen ganger endres uventet. Det er en kompleks eldre kodebase med mange tråder.

Oppsummering av avansert feilsøking

Godt jobbet! De har fått kontroll på avanserte feilsøkingsteknikker for Objective-C.

  • Betingede stoppunkter og handlingsstoppunkter gir presis kontroll over når og hvordan programmet settes på pause eller logger.
  • Symbolske stoppunkter og unntaksstoppunkter fanger opp bestemte hendelser, som metodekall eller kastede feil.
  • Watchpoints er uvurderlige for å spore opp mystisk datakorrupsjon.
  • LLDB-kommandoer gir kraftig konsollkontroll for å undersøke programtilstanden.
  • os_log gir strukturert og effektiv logging for komplekse apper og produksjonsapper.

Disse verktøyene vil forbedre evnen Deres til å feilsøke komplekse problemer i enhver Objective-C-kodebase betydelig.

Gratis å komme i gang

Lær deg Objective-C med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
12
Leksjoner
48

Ofte stilte spørsmål

Er leksjonen «Avanserte feilsøkingsteknikker» gratis?

Ja – hele teksten i «Avanserte feilsøkingsteknikker» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper inneholder totalt 4 leksjoner.

Hva lærer jeg i «Avanserte feilsøkingsteknikker»?

Bli fortrolig med Xcode-feilsøkeren, bruddpunkter og strategier for logging for å feilsøke komplekse problemer i Objective-C-kodebaser. Du øver på Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper?

Ingen tidligere erfaring er nødvendig. Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Avanserte feilsøkingsteknikker»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper-leksjonen?

Ja. Alle Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Finne minnelekkasjer med Instruments
  2. Optimalisering av UI-gjengivelse og respons
  3. Avanserte feilsøkingsteknikker
  4. Profilering og redusert oppstartstid for apper
← Tilbake til Objective-C iOS-utvikling for eldre kodebaser og virksomhetsapper