Jak debugować rozszerzenia iOS 8 za pomocą NSLog?


90
- (void)viewDidLoad
{
    NSLog(@"%s", __func__);
    // ...
}

w rozszerzeniuviewDidLoad iOS 8 . wyjść nic w Xcode. działa jednak jak zwykle w aplikacji kontenera.NSLogNSLog

Jak mogę uzyskać wyniki komunikatów debugowania z rozszerzenia?


Ja też mam ten problem. Może NSLog jest po prostu uszkodzony. W tej chwili używam Breakpoints do debugowania wartości. Ale są też naprawdę wadliwe.
gallileo

Mam podobny problem, gdzie debugger nigdy się nie zatrzaskuje i zawsze mówi „czeka na podłączenie” w Xcode. Niestety, nie widzę nic pożytecznego z googlowania i opublikowałem tutaj pytanie na Stosie bez jeszcze odpowiedzi.
Alex Bollbach,

Odpowiedzi:


95
  1. Debugowanie działa w przypadku rozszerzeń aplikacji.
  2. Działa też na symulatorze.
  3. Jeśli rozszerzenie aplikacji ulegnie awarii w symulatorze, może się okazać, że ponowne uruchomienie rozszerzenia aplikacji nie jest łatwe. Ponowne uruchomienie symulatora to szybkie rozwiązanie.
  4. Kroki, aby debugować rozszerzenie aplikacji:

    1. Uruchom aplikację kontenera. W tym kroku Xcode przesyła aplikację kontenera i rozszerzenie aplikacji na urządzenie lub symulator.

    2. Zatrzymaj aplikację kontenera. Ten krok jest ważny podczas debugowania w symulatorze. Jeśli tego nie zrobisz, Xcode poinformuje Cię, że symulator jest używany.

    3. W Xcode naciśnij menu Debuguj -> Dołącz do procesu -> Według identyfikatora procesu (PID) lub nazwy ..., wprowadź identyfikator rozszerzenia aplikacji, np. Com.abc.ContainerApp.MyExtension, aby rozpocząć debugowanie. Nie zapomnij ustawić punktów przerwania. (Aktualizacja z 25 sierpnia 2014 r .: możesz bezpośrednio wprowadzić MyExtension (nazwę twojego rozszerzenia).)

    4. Na urządzeniu lub w symulatorze otwórz rozszerzenie aplikacji.


Aktualizacje w dniu 23 sierpnia 2014 r .:

Zauważyłem, że powyższe kroki debugowania nie działają dobrze na Xcode 6 beta 6 z iOS 8 SDK beta 5 na symulatorze.

Rozwiązanie:

  1. Uruchom rozszerzenie w symulatorze.
  2. Debuguj menu Xcode -> Dołącz do procesu -> Wybierz „Moje rozszerzenie (nazwa twojego rozszerzenia)” w sekcji System w menu.

Punkty przerwania działają. Ale nie wiem, dlaczego dzienniki nie są wyświetlane w oknie danych wyjściowych.


8
Jak dotąd najłatwiejszym sposobem debugowania (i zobaczenia NSLog), które znalazłem, jest wykonanie następujących kroków: /// 1 /// Wybierz schemat aplikacji kontenera i uruchom go. /// 2 /// Po uruchomieniu - przełącz się z powrotem na XCode i (nawet bez naciskania przycisku Stop) wybierz schemat rozszerzenia, a następnie naciśnij przycisk Uruchom. /// 3 /// Po wyświetleniu monitu o wybranie aplikacji do uruchomienia wybierz Dzisiaj. /// 4 /// Teraz punkty przerwania i NSLog powinny działać bez problemów.
przerwać

1
To nie działa do dziś, zwłaszcza po wypadku. To jest bardzo irytujące, nie rozumiem, dlaczego tak trudno to naprawić.
Cristi Băluță

3
Próbowałem użyć zaktualizowanych instrukcji powyżej i zadziałało. Jednak w kroku 2, zamiast używać mojej nazwy rozszerzenia, użyłem „Według identyfikatora procesu (PID) lub nazwy ...” i wprowadziłem pid procesu. To magicznie pozwoliło mi wykorzystać moje punkty przerwania.
tony.tc.leung

Debug> Attach To Process by PID lub name: w polu tekstowym wprowadź nazwę procesu w nawigatorze debugowania, na przykład com.company.AppName.AppName-ExtensionName
TigerCoding

Ta odpowiedź nie odnosi się do pytania. OP pyta, dlaczego komunikaty NSLog nie są zapisywane na konsoli w rozszerzeniu (uzasadniona obawa, ponieważ przyszedłem na tę stronę z tym samym pytaniem). Nie wspomina o problemach z łączeniem się z debugerem.
Joey Carson,

49

Ja też mam ten problem. U mnie działa, jeśli przejdziesz do swojego symulatora w menu Debug -> Otwórz dziennik systemu ...

Stąd możesz zobaczyć wszystkie dzienniki iPhone Simulator (w tym dzienniki twojego rozszerzenia).

wprowadź opis obrazu tutaj


otworzy się „~ / Library / Logs / CoreSimulator / <DEVICE_IDENTIFIER> /system.log”, dzięki czemu można tam łatwo znaleźć wszystkie inne dzienniki urządzeń symulatora, po prostu zastąp <DEVICE_IDENTIFIER> identyfikatorem urządzenia symulatora
Hofi

32

NSLogdziała idealnie .

Po prostu nie widzisz, co jest rejestrowane w obszarze debugowania Xcode, ponieważ debuger Xcode nie jest dołączony do twojego rozszerzenia. Rozszerzenia są prawie całkowicie niezależne od ich aplikacji. Mają na przykład oddzielne identyfikatory pakietów, a także są oddzielnymi procesami w systemie operacyjnym.

Miałem różne sukcesy w dołączaniu Xcode do rozszerzeń. Podobno wygląda na to, że załączyłby się automatycznie i pojawia się w nawigatorze debugowania jako „Oczekiwanie na dołączenie”, ale nigdy nie jest dołączany.

Czasami mogę uruchomić mój cel rozszerzenia w Xcode:

wprowadź opis obrazu tutaj

A potem mam możliwość wyboru aplikacji, w której ma uruchamiać moje rozszerzenie. W tym przypadku wybrałbym jego rekomendację „dzisiaj”, czyli centrum powiadomień.

wprowadź opis obrazu tutaj

A potem czasami dołączał debugger do mojego rozszerzenia. Wydaje się, że ta metoda działa tylko na urządzeniach fizycznych.

Jeśli nie dołącza, możesz użyć ręcznej metody mocowania w odpowiedzi @ VinceYaun,

Odniosłem również różne sukcesy, używając innych metod przywiązania. Większość zakończyła się niepowodzeniem i wygląda na to, że są to tylko błędy, które zostaną naprawione w późniejszym terminie.

Aby wyświetlić komunikaty dziennika, przejdź do Window-> Devicesna górnym pasku i wybierz swoje urządzenie. Możesz wywołać dziennik urządzenia z dołu tego okna. Jeśli testujesz na symulatorze, można użyć @ BalestraPatrick za odpowiedź .

Niektóre błędy zostały naprawione w wersji Beta 2 i przypuszczam, że ostatecznie debugger będzie się automatycznie podłączał podczas uruchamiania rozszerzenia.

Aktualizacja: W iOS 8 Beta 4 informacjach o wydaniu :

Rozszerzenia

Naprawiono w wersji beta 4

  • Rozszerzenia czasami nie uruchamiają się podczas debugowania z Xcode.
  • Gdy rozszerzenie z interfejsem użytkownika zostanie zabite, uruchamia się ponownie i nie jest odrzucane.
  • Czasami rozszerzenie udostępniania lub działania może się zawiesić.
  • Ponowne wdrożenie rozszerzenia może spowodować jego wyłączenie w centrum powiadomień.

czy wypróbowałeś to samo podejście w przypadku rozszerzeń pamięci?
SRP-Achiever

To nie zadziałało dla mnie w Xcode 6 beta 2, ale odpowiedź Vince Yuan tak. Niestety, debugowanie rozszerzenia Xcode 6 beta 3 w ogóle nie działa. Nie znalazłem rozwiązania tego problemu, prawdopodobnie musimy poczekać na kolejne wydanie.
Darrarski

@Darrarski Moja odpowiedź została z Beta 1. FYI, Beta 3 jest już niedostępna, więc powinieneś już być na tym.
Święty Mikołaj

@SantaClaus całkiem jasne. Moim komentarzem było poinformowanie, że żadne z podanych rozwiązań nie działa dla mnie w Xcode 6 beta 3. Wygląda na to, że debugowanie rozszerzeń jest jeszcze bardziej zepsute w tej wersji. Miejmy nadzieję, że następna beta rozwiąże problem.
Darrarski

3
Żaden z tych błędów nie wyglądał na naprawiony w wersji beta 4 (obecnie beta 5).
mat.

18

Ja też mam ten problem. Xcode nigdy nie dołącza mojego debugera do rozszerzenia ani nie wyświetla komunikatów NSLog. Jeśli ręcznie dołączysz debuger Xcode do procesu rozszerzenia, przynajmniej punkty przerwania będą działać jak urok:

Debug->Attach to process->Your extension name (mine was "com.example.MyExtensionApp.MyExtension")

5
Miałem z tym mieszane szczęście.
Święty Mikołaj

2
upvote, ale nie zawsze działa, mam nadzieję, że Apple może automatycznie dołączać debugger do rozszerzeń w przyszłych wersjach.
Jing

14
  1. Utwórz schemat dla swojego rozszerzenia
  2. Uruchom schemat
  3. W oknie dialogowym wybierz aplikację kontenera
  4. Cieszyć się

U mnie działa :)


To jest dokładnie to, czego potrzebowałem
pob21

1
NSLogbędzie działać tylko wtedy, gdy używasz aplikacji kontenera. To nie będzie działać, jeśli używasz App-rozszerzenie zamiast pojemnika.
JaredH

To zadziałało również dla mnie. Dziękuję Maciek Czarnik! Powyższe rozwiązania nie działały u mnie. Używam Xcode 8.1.
plam4u

5

Xcode 8 może debugować rozszerzenia:

  1. Wybierz schemat rozszerzenia w kombinacji obok przycisku zatrzymania i uruchom go.
  2. Wybierz aplikację nadrzędną w wyświetlonym oknie dialogowym.

Wynik: punkty przerwania i dziennik działają normalnie.


2
Nie działa w moim przypadku rozszerzenia Today. uzyskiwanie błędu CLANG: ld: nie znaleziono biblioteki dla -lRPush clang: błąd: polecenie konsolidatora nie powiodło się z kodem zakończenia 1 (użyj -v, aby zobaczyć wywołanie)
BadmintonCat

To jest niepowiązany błąd. Próbujesz utworzyć link do brakującej biblioteki. Dodaj Liferay-Push do swojego celu.
Jano,

4

Co ostatecznie pozwoliło mi zobaczyć dziennik w obszarze debugowania, oparty na sugestii Michaela i dokumentacji Apple , to:

Skompiluj i uruchom rozszerzenie aplikacji w symulatorze, a po wyświetleniu monitu o aplikację hosta wybierz konkretną aplikację, z której chcesz wywołać rozszerzenie . W moim przypadku uruchamiałem rozszerzenie Action z Safari, wyciągając arkusz udostępniania w pliku PDF.

To, co wcześniej nie działało, to podążanie za sugestiami innych osób, aby użyć Today jako gospodarza, ale potem opuściłem tę aplikację i przeszedłem do Safari, aby zadzwonić do mojego rozszerzenia. Nie muszę już nawet uruchamiać mojej aplikacji zawierającej przed uruchomieniem rozszerzenia.

Z dokumentacji Apple:

W fazie uruchamiania schematu rozszerzenia określasz aplikację hosta jako plik wykonywalny. Po uzyskaniu dostępu do rozszerzenia za pośrednictwem interfejsu użytkownika określonego hosta debuger Xcode dołącza do rozszerzenia.



1

Sztuczka, która działa na mnie (choć jest dość brzydka) polega na umieszczeniu manekina UILabelgdzieś w dolnym rogu mojego przedłużenia. Zwykle to nazywam logLabel. Możliwe jest wtedy zaktualizowanie tekstu tej etykiety o dowolną instrukcję dziennika, która ma być rejestrowana. Takie podejście nie jest zbyt dobre, jeśli musisz rejestrować instrukcje z instancji różnych klas. I oczywiście zaśmieca twój interfejs użytkownika.

Jeśli jednak masz dość prosty widget i nie przeszkadza ci lekkie zaśmiecenie interfejsu użytkownika, to załatwia sprawę. Wypróbowałem wszystkie inne rozwiązania przedstawione w tej dyskusji i niestety żadne z nich nie zadziałało.


1

Jedynym sposobem, w jaki działa debugowanie, jest wybranie Debuguj-> Dołącz do procesu przez PID lub nazwę. Następnie wprowadź PID, a nie nazwę rozszerzenia. Możesz znaleźć PID, uruchamiając rozszerzenie na urządzeniu, przejdź do Okno-> Urządzenia. Znajdź swoje urządzenie i wyświetl konsolę. Gdy zobaczysz nazwę swojego numeru wewnętrznego, po niej następuje 5-cyfrowy numer. To jest PID

Umieściłem też kilka NSLog w rozszerzeniu, aby znaleźć również PID. To jest w xCode 7


1

Napotkaj ten sam problem dotyczący rozszerzenia dla NSLogi punktów przerwania. Walczyłem z tym przez wiele dni.

Device logmożna znaleźć jako poniższy obraz. Jest o godzXCode -> Window -> Devices and Simulators .

Po wpisaniu w Open Consoleprawym górnym rogu okna dialogowego pojawi się pole wyszukiwania. Mogę tam zastosować regułę filtru. Na przykład nazwa procesu zawiera Notificationsłowo kluczowe lub nazwa procesu musi być równa nazwie celu rozszerzenia, np. Równa MyNotificationServiceExtensionnazwie procesu.

Dziennik urządzenia


0

Najwyraźniej coś jest zepsute w Xcode6-B5.

Jeśli spróbuję uruchomić rozszerzenie Photo w symulatorze, nie widzę aplikacji Photos.app jako opcji procesu dołączania rozszerzenia.

opcje debugowania w symulatorze

To samo, działając na prawdziwym urządzeniu, daj mi prawidłowe zachowanie.

opcje debugowania za pomocą prawdziwego urządzenia

W pierwszym przypadku żaden punkt przerwania nie jest honorowany. W tym drugim przypadku punkty przerwania działają jak urok.


0

Powinieneś wiedzieć, że aplikacja kontenera i rozszerzenie to całkowicie dwa różne procesy w iOS, podczas gdy LLVM debuguje tylko wątek na raz, więc podczas debugowania konsola nigdy nie rejestruje rozszerzenia i nigdy nie zatrzymuje się w punkcie przerwania.

Możesz rozwiązać większość problemów metodą @Vince Yuan.

Jednak moim problemem jest to, że debugger Xcode prawie nie podpina mojego rozszerzenia klawiatury zarówno na symulatorze iOS, jak i na urządzeniach, na przykład 1 raz na 7-8 uruchomień, to całkowicie kwestia prawdopodobieństwa. Metoda @Vince Yuan również czasami działa.

Moje małe doświadczenie polega na tym, że po uruchomieniu schematu debugowania, jeśli sesja debugowania w lewym panelu pokazuje `` Brak sesji debugowania '', nie ma potrzeby otwierania rozszerzenia i testowania go, debugger się nie włączył, po prostu uruchom znowu na szczęście.

ale kiedy zobaczysz com.xxx.xxx.xxx czeka na dołączenie, rozszerzenie może z pewnością zostać zdebugowane.

To mała sztuczka, dla której nie można debugować rozszerzenia iOS, zwłaszcza rozszerzenia klawiatury.


0

Począwszy od Xcode 6 Beta 5, mogłem używać rzeczywistego urządzenia z systemem iOS8 do debugowania mojego rozszerzenia. Spróbuj uruchomić go na urządzeniu i wybierz Safari, aby uruchomić


0

Aby przezwyciężyć wszystkie stany spowodowane ciągłymi zmianami IDE, używam konsoli iOS firmy lemonjar.com - wyświetla ona okno konsoli dla dowolnego podłączonego urządzenia z systemem iOS wyświetlającego komunikaty syslog niezależnie od identyfikatora procesu. W tym miejscu możesz zobaczyć jednocześnie komunikaty dziennika debugowania aplikacji i rozszerzenia.


0

Mogę debugować moje rozszerzenie w sposób opisany poniżej:

  1. Xcode : Debug-> Attach to process by PID or Name. Nazwa Twojego schematu rozszerzenia.
  2. Następnie wybierz swój main app targeti biegnij.

Mam nadzieję, że w was też działa.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.