2013-12-15 11 views
6

mam wykorzystane profilera aby zwrócić uwagę na wycieki pamięci i natknąłem się na ten problem:iOS: Jak zidentyfikować wyciek z instrumentów Xcode?

enter image description here

przeszedłem zadzwonić Tree.

Mogłem więc kliknij na nim, aby dowiedzieć się więcej na ten temat:

enter image description here

Ale tak naprawdę nie daje mi żadnego pojęcia. Skąd mam wiedzieć, co spowodowało wyciek?

enter image description here

UPDATE:

  • drzewo wezwanie z bibliotek systemowych przedstawionych powyżej jest aktualizowana.
  • informacje o obiektach wyciekły:

enter image description here

  • jakiś opis tego, co robisz w aplikacji, aby odtworzyć ten wyciek:

Nasza aplikacja synchronizuje się z naszą REST- API po uruchomieniu (pierwszym planie) aplikacji. To działa zawsze na moim iOS 7/iPhone 4S. Ale inny programista ma iOS7/iPhone 5 i rzadko sięga do problemu, który nie jest zsynchronizowany. Po 10 dniach obserwacji i oddanie NSLogs wszędzie, znaleźliśmy tę ostatnią noc:

Dec 15 03:18:58 appname[4801] <Warning>: A gateway to the host server is working via WWAN. 
Dec 15 03:18:58 appname[4801] <Warning>: Syncing... 
Dec 15 03:18:58 appname[4801] <Warning>: Eventname to be fired: f11-reachability 
Dec 15 03:18:58 appname[4801] <Warning>: Sync event IOS_REACHABILITY reached. 
Dec 15 03:18:58 appname[4801] <Warning>: Sync: IOS_SYNC_WITH_SERVER is true 
Dec 15 03:18:58 appname[4801] <Warning>: Animating indicator... 
Dec 15 03:18:58 appname[4801] <Warning>: Getting last timestamp: 1387003344.407783 then calling syncWithServerWithDate 
Dec 15 03:19:27 com.apple.launchd[1] <Notice>: (UIKitApplication:com.apple.mobilecal[0x45fb]) Exited: Killed: 9 
Dec 15 03:19:27 com.apple.launchd[1] <Notice>: (com.apple.afcd) Idle-exit job was jettisoned. Will bypass throttle interval for next on-demand launch. 
Dec 15 03:19:27 com.apple.launchd[1] <Error>: (com.apple.afcd) assertion failed: 11B554a: launchd + 35697 [3C91C465-EFA6-32C7-A677-DD0B5FDEE0DC]: 0x9 
Dec 15 03:19:27 com.apple.launchd[1] <Notice>: (com.apple.absd) Idle-exit job was jettisoned. Will bypass throttle interval for next on-demand launch. 

Trzecia próba synchronizacji (HOME naciśnięcie przycisku, a wracając do planie) dał nam to, co wskazywało na niską pamięci:

Dec 15 03:25:18 C1 appname[4801] <Warning>: Getting last timestamp: 1387003344.407783 then calling syncWithServerWithDate 
Dec 15 03:25:29 C1 profiled[6244] <Notice>: (Note) profiled: Service stopping. 
Dec 15 03:25:40 C1 crash_mover[6248] <Notice>: (Warn) <crash_mover.m mv_recursive:98> Moving './LowMemory-2013-12-14-160222.plist' -> '/var/mobile/Library/Logs/CrashReporter/LowMemory-2013-12-14-160222.plist' 

Więc pomyślałem, że mogę dać profilerowi i sprawdzić, czy coś znajdę.

Aby go odtworzyć, uruchomiłem aplikację, przeszedłem do ekranu głównego, następnie nacisnąłem przycisk Simulate a Low Memory, a następnie kliknąłem aplikację, aby powrócić na pierwszy plan. To tutaj dostaję czerwony kolec.

  • jaka jest używana wersja Xcode.

Xcode 5.02. iOS 7.04 na iPhone 4S (OK), iPhone 5 (rzadki przypadek krawędzi)

Mam nadzieję, że to pomoże. Dziękujemy

+0

Wszystkie te małe pudełka po lewej stronie pod nagłówkiem "Wywołanie drzewa". Zazwyczaj kliknięcie wszystkich z nich daje znacznie bardziej czytelne wyniki. –

+0

Po ręcznym zasygnalizowaniu ostrzeżenia o pamięci wystąpił błąd synchronizacji, którego doświadczał Twój współpracownik? – Rob

Odpowiedz

2

Pojawia się groźny czerwony szpic Wycieków, całkowita pamięć przecieka 1,06kb, co jest bardzo mało prawdopodobne, aby było źródłem (a nawet związanym z) twojego problemu.

Jeśli chodzi o aplikację powodującą odrzucenie innych aplikacji, to samo w sobie nie stanowi problemu, a ja bym się tym mniej przejmował (chociaż, aby być dobrym obywatelem, naprawdę powinieneś próbować zminimalizować to).Bardziej bezpośrednim problemem funkcjonalnym jest to, że aplikacja nie synchronizuje się i czy jest to spowodowane ostrzeżeniem o pamięci w samej aplikacji (lub dokładniej, czy aplikacja nie jest wystarczająco wolna, aby uwolnić zasoby w odpowiedzi na ostrzeżenie o pamięci, w kolejnych alokacjach pamięci, aby zakończyć się niepowodzeniem).

Moim zdaniem, pierwsze pytanie brzmi: czy naprawdę otrzymujesz ostrzeżenia o pamięci w aplikacji. Ogólnie rzecz biorąc, chciałbym zobaczyć coś jak następuje w konsoli jeśli aplikacja naprawdę miał ostrzeżenie pamięci:

 
Dec 15 11:12:26 Robs-iPad myapp[2224] : Received memory warning. 

Ale nie widzę wyżej w swoich wysypisk konsoli, więc to sprawia, że ​​zastanawiam się, czy was” Naprawdę otrzymuje ostrzeżenia o pamięci.

mógłbym zasugerować wkładając wyraźny rejestrowanie w aplikacji delegata:

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application 
{ 
    NSLog(@"%s", __FUNCTION__); 

    // free whatever caches or other temporary resources you can here 
} 

lub umieścić w specjalnej obsługi w kontrolerze widoku:

- (void)didReceiveMemoryWarning 
{ 
    NSLog(@"%s", __FUNCTION__); 

    [super didReceiveMemoryWarning]; 

    // do whatever you want to free resources here 

    [[[UIAlertView alloc] initWithTitle:nil 
           message:@"didReceiveMemoryWarning" 
           delegate:nil 
         cancelButtonTitle:@"OK" 
         otherButtonTitles:nil] show]; 
} 

To spowodowałoby obejrzeniu następujących w moim konsoli:

 
Dec 15 11:12:26 Robs-iPad myapp[2224] : -[AppDelegate applicationDidReceiveMemoryWarning:] 
Dec 15 11:12:26 Robs-iPad myapp[2224] : -[ViewController didReceiveMemoryWarning] 

Ale najważniejszym celem jest potwierdzenie, czy rzeczywiście e otrzymujesz ostrzeżenia o pamięci i czy to naprawdę koreluje z brakiem synchronizacji Twojej aplikacji.

Ale załóżmy przez chwilę, że problem jest w rzeczywistości wynikiem ostrzeżenia o pamięci. To prowadzi do dwóch pytań: Po pierwsze, co robisz, aby złagodzić ostrzeżenia pamięci w pierwszej kolejności (np. Za pomocą @autoreleasepool, aby złagodzić wysoki znak wody, nie trzymając dużego zasobu w pamięci w tym samym czasie, jeśli nie jest to absolutnie konieczne, przy użyciu imageWithContentsOfFile zamiast imageNamed)? Po drugie, co robisz w odpowiedzi na ostrzeżenia o pamięci (np. Czy czyścisz pamięci podręczne itp.)?

Jeśli więc potwierdzisz, że ostrzeżenie o pamięci jest prawdziwym źródłem problemu (i zrób to najpierw), może być interesujące spojrzenie na wykres alokacji podczas procesu synchronizacji (i potwierdzenie maksymalnej liczby live bytes, a także końcowa liczba żywych bajtów). Patrząc na wykres alokacji w twoim pytaniu, nie wygląda on zbyt źle (tzn. Nie ma dzikich wahań), ale potem znowu nie udostępniłeś nam liczby "żywych bajtów", więc trudno powiedzieć.

Ale na pewno nie martwię się tym wyciekiem 1kb podczas symulowania ostrzeżenia o pamięci. To bardziej irytuje niż jakikolwiek poważny objaw, o który musisz się martwić. Miej oko na przecieki, ale skup się na (a) dużych nieszczelnościach; i (b) w twoim kodzie, a nie w frameworkach.


Mój oryginalny odpowiedzi, poniżej, w odpowiedzi na oryginalne pytanie, które było jedynie „co to jest przeciek pokazane instrumentami, które nie wydają się odpowiadać do mojego kodu”. będę go trzymać tutaj dla odniesienia:


Może to sugerować, że wyciek nie jest w kodzie, ale raczej w ramach systemu (który już ukryte).

Może chcesz podzielić:

  • drzewo wezwanie z bibliotek systemowych przedstawionych;

  • informacje o wyciekach obiektów (więc nie tylko "drzewo wywołań", ale także lista "wycieków");

  • jakiś opis tego, co robisz w aplikacji, aby odtworzyć ten wyciek;

  • Które wersje iOS widzą ten problem, a których wersji nie masz (frameworki nie są bez wycieków, ale różnią się w zależności od celu systemu iOS); i

  • jaka jest wersja Xcode.

Szczerze mówiąc, możesz odrzucić tę kwestię biorąc pod uwagę (a) niewielki rozmiar wycieku; (b) brak wskazania, że ​​problem leży w kodzie; oraz (c) fakt, że ramy iOS mają przecieki poza twoją kontrolą. Ale jeśli jesteś zaniepokojony, podziel się niektórymi z powyższych informacji i być może będziemy mogli zaoferować dalsze spostrzeżenia.

+0

Dziękuję Rob. Zaktualizowałem to pytanie i dostarczyłem wszystko, o co prosiłeś. Po 10 dniach polowania na ten błąd, jesteśmy trochę w stanie desperacji. Mam nadzieję, że możesz wskazać nam coś tutaj. :) – Houman

+0

@Hooman Rozszerzyłem moją odpowiedź, ale w skrócie, nie jest dla mnie jasne, że problem jest związany z ostrzeżeniem o pamięci (i prawie na pewno nie ma związku z wyciekiem 1kb). Twoja aplikacja najwyraźniej powoduje odrzucenie innych aplikacji, ale nie pokazuje żadnych ostrzeżeń o pamięci. Nawet jeśli byłby to skutek ostrzeżenia o pamięci, jeśli uwolnisz zasoby, powinieneś zauważyć, że alokacje nieco się zmniejszają (albo też aplikacja najprawdopodobniej ulegnie awarii, jeśli nie rozwiążesz sytuacji powodującej ostrzeżenie o pamięci) . Czy aplikacja się zawiesza, czy po prostu nie synchronizuje? – Rob

Powiązane problemy