2010-09-24 11 views
7

Naprawdę chciałbym zobaczyć co metodę, delegata, powiadomienie, itp., Który jest wywoływany/wysyłany podczas uruchamiania mojej aplikacji w iPhone Simulator. Myślałem, że właściwe miejsce na to znajdzie się w debugerze, ale nie mogę znaleźć właściwego ustawienia.Jak mogę zobaczyć każdą metodę wywołaną, gdy uruchomię swoją aplikację w iPhone Simulator?

Moim celem jest zobaczenie wszystkiego, co dzieje się w tle, podczas gdy ja na przykład dodaję wiersz do UITableView lub wciskam przycisk "back" z mojego UINavigationController.

Byłoby to bardzo pomocne, aby dowiedzieć się, co delegat używać, gdy coś się dzieje aplikacji lub gdy użytkownik naciska przycisk, zmieniając widok itp

Czy to możliwe, aby uzyskać tę informację ?

Odpowiedz

8

Możesz wylogować się z wszystkiego, co dzieje się podczas działania aplikacji, korzystając z DTrace, platformy, która pozwala badać działanie wszystkich elementów działających na współczesnym komputerze Mac. Nie mamy jeszcze DTrace na iOS, ale będzie działać, gdy będziesz korzystać z symulatora.

Opisuję podstawy DTrace w this article dla MacResearch, a następnie podam przykład niestandardowego instrumentu, który można zbudować w Instruments przy użyciu DTrace pod koniec this article. Ten instrument wylogowuje wszystkie metody wywoływane na wszystkich obiektach (nawet wewnętrznych) w momencie rozpoczęcia aplikacji, aż osiągnie koniec -applicationDidFinishLaunching:.

Aby to uprościć, można po prostu utworzyć niestandardowy instrument za pomocą pozycji menu Instrument | Build New Instrument w instrumentach.Ustaw jeden z deskryptorów sondy wyglądać następująco:

alt text

ignorować tylko opcje rejestrowania isInApplicationStart i datownik. Prosta sonda reagująca na dowolną metodę Objective-C w dowolnej klasie będzie rejestrować wszystkie te komunikaty do konsoli Instruments, co brzmi jak to, czego potrzebujesz do debugowania.

+0

dziękuję za odpowiedź! Spróbuję też, kiedy znajdę czas. przepraszam za opóźnienie! – Micko

+0

Daje mi to błąd krytyczny. dowolny pomysł – ramo

0

Jeśli umieścisz punkt przerwania w swojej aplikacji, możesz obserwować zmianę stosu połączeń podczas przeglądania kodu. To prawdopodobnie tak blisko, jak masz zamiar dojść do tego, co masz na myśli.

+0

To jest właściwy kierunek, ale nadal nie da ci wszystkiego, co się dzieje. czy tam jeszcze coś notujesz? – Micko

+0

Możesz umieścić punkt przełomowy w pierwszym wierszu głównego() i dosłownie przejść przez każdy wiersz kodu i do każdego wywołania w strukturze. Nie wiem, co jeszcze mógłbyś chcieć zobaczyć. –

5

Zakładając, że jesteś pewien, że chcesz absolutnie wszystko ...

  1. Breakpoint objc_msgSend i objc_msgSend_stret. Prawie wszystkie wywołania metod używają tych dwóch funkcji (bełkotliwy bełkot IMP-cacheing).
  2. OK, teraz twoja aplikacja cały czas przechodzi do debuggera. Kliknij więc pole automatycznego kontynuowania.
  3. Ale teraz nie widzisz zbyt wiele, więc edytuj punkty przerwania i dodaj polecenie "bt", aby uzyskać ślad wstecz.
  4. Utonięcie w spamie debugowania.

Oczywiście nie będzie to oznaczać innych funkcji C.

Jeśli chcesz po prostu złapać powiadomienia, można zrobić coś takiego (znacznie mniej spamu):

+(void)load 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleEveryNotification:) name:nil object:nil]; 
} 

+(void)handleEveryNotification:(NSNotification*)notification 
{ 
    CFShow(notification); 
} 

Oczywiście, powiadomienia są wykonane z normalnych wywołań metod, więc pierwsza metoda będzie również pokazać im, (choć w dużej ilości spamu).

Delegaci nie są wywoływani ani wysyłani; są po prostu normalnymi wywołaniami metody Obj-C (ściśle "wysyłają wiadomości", ale nie mają tego samego pierścienia).

+0

dziękuję za odpowiedź! Spróbuję, kiedy znajdę czas. przepraszam za opóźnienie! – Micko

+0

Czy można przechwytywać inne funkcje C? –

+0

@BenDowling Sure: Punkt przerwania dla każdego punktu wejścia funkcji. Znalezienie ich będzie nieco trudniejsze. –

Powiązane problemy