NSLog ile iOS 8 uzantılarında nasıl hata ayıklanır?


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

içinde viewDidLoadbir IOS 8 uzantısı . NSLogXcode çıkışlar şey. NSLogyine de konteyner uygulamasında her zamanki gibi çalışır.

Bir uzantıdaki hata ayıklama mesajlarından nasıl çıktı alabilirim?


Bende de bu sorun var. Belki NSLog sadece bozulmuştur. Şu anda değerlerde hata ayıklamak için Kesme Noktaları kullanıyorum. Ama onlar da gerçekten arabacı.
gallileo

Benzer bir sorunum var, hata ayıklayıcı asla kilitlenmiyor ve Xcode'da her zaman "eklenmeyi bekliyor" diyor. Maalesef, googling'in hiçbir faydasını görmüyorum ve burada Stack'ta henüz yanıtı olmayan bir soru yayınladım.
Alex Bollbach

Yanıtlar:


96
  1. Hata ayıklama, uygulama uzantıları için çalışır.
  2. Simülatörde de çalışıyor.
  3. Uygulama uzantınız simülatörde çökerse, uygulama uzantınızı yeniden başlatmanın kolay olmadığını görebilirsiniz. Simülatörünüzü yeniden başlatmak hızlı bir çözümdür.
  4. Bir uygulama uzantısında hata ayıklama adımları:

    1. Kapsayıcı uygulamasını çalıştırın. Bu adımda Xcode, kapsayıcı uygulamasını ve uygulama uzantısını cihaza veya simülatöre yükler.

    2. Kapsayıcı uygulamasını durdurun. Simülatörde hata ayıklarken bu adım önemlidir. Bunu yapmazsanız, Xcode size simülatörün kullanımda olduğunu söyleyecektir.

    3. Xcode'da, Hata Ayıkla -> İşleme İliştir -> İşlem Tanımlayıcısına (PID) veya Ada Göre ... menüsüne basın, hata ayıklamayı başlatmak için uygulama uzantısının tanımlayıcısını girin, örneğin com.abc.ContainerApp.MyExtension. Kırılma noktaları belirlemeyi unutmayın. (25 Ağustos 2014'te güncelleme: MyExtension'ı (uzantınızın adı) doğrudan girebilirsiniz.)

    4. Cihazda veya simülatörde, uygulama uzantınızı açın.


23 Ağustos 2014 ile ilgili güncellemeler:

Yukarıdaki hata ayıklama adımlarının simülatörde iOS 8 SDK beta 5 ile Xcode 6 beta 6'da iyi çalışmadığını buldum.

Çözüm:

  1. Uzantınızı simülatörde çalıştırın.
  2. Xcode menüsü Hata Ayıkla -> İşleme Ekle -> Menüdeki Sistem bölümünde "MyExtension (uzantınızın adı)" öğesini seçin.

Kesme noktaları çalışır. Ancak çıktı penceresinde günlüklerin neden gösterilmediğini bilmiyorum.


8
Şu ana kadar bulduğum hata ayıklamanın en kolay yolu (ve NSLog'a bakın) şu adımları takip etmektir: /// 1 /// Bir kapsayıcı uygulama şeması seçin ve çalıştırın. /// 2 /// Çalışmaya başladıktan sonra - XCode'a geri dönün ve (Durdur düğmesine bile basmadan) bir uzantı şeması seçin, ardından Çalıştır düğmesine basın. /// 3 /// Çalıştırılacak uygulamayı seçmeniz istendiğinde Bugün'ü seçin. /// 4 /// Artık kesme noktaları ve NSLog sorunsuz çalışmalıdır.
araya

1
Bu, özellikle bir kazadan sonra bugün bile çalışmıyor. Bu çok can sıkıcı, düzeltmenin neden bu kadar zor olduğunu anlamıyorum.
Cristi Băluță

3
Yukarıdaki güncellenmiş talimatları kullanmaya çalıştım ve benim için çalıştı. Ancak 2. adımda uzantı adımı kullanmak yerine "İşlem Tanımlayıcısı (PID) veya Adına Göre ..." kullandım ve işlemin kimliğini girdim. Bu, sihirli bir şekilde kırılma noktalarımı kullanmama izin verdi.
tony.tc.leung

Hata Ayıkla> İşleme PID veya ada göre Ekle: metin alanına hata ayıklama gezginine işlem adını girin, com.company.AppName.AppName-ExtensionName
TigerCoding

Bu cevap soruyla alakalı değil. OP, NSLog mesajlarının konsola neden bir uzantı olarak yazılmadığını soruyor (bu sayfaya aynı soruyla geldiğim için meşru bir endişe). Hata ayıklayıcıya bağlanan sorunlar hakkında hiçbir şeyden bahsetmiyor.
Joey Carson

49

Ben de bu sorunu yaşıyorum. Simülatörünüze Hata Ayıkla -> Sistem Günlüğünü Aç ... menüsüne girerseniz benim için çalışır.

Buradan iPhone Simulator'un tüm günlüklerini görebilirsiniz (uzantınızın günlükleri dahil).

görüntü açıklamasını buraya girin


o açılacaktır "~ / Library / Kayıtlar / CoreSimulator / <DEVICE_IDENTIFIER> /system.log" kolayca diğer simülatörü cihazlar günlüklerinin orada tüm bulabilmeniz için çok adil yerine <DEVICE_IDENTIFIER> simülatör cihazı kimliğiyle
Hofi

32

NSLogmükemmel çalışıyor .

Xcode hata ayıklayıcı uzantınıza bağlı olmadığından, Xcode'un hata ayıklama alanında neyin günlüğe kaydedildiğini görmezsiniz. Uzantılar, içerdikleri uygulamadan neredeyse tamamen bağımsızdır. Örneğin ayrı paket tanımlayıcıları vardır ve ayrıca işletim sistemi üzerinde ayrı işlemlerdir.

Uzantılara eklemek için Xcode'u alma konusunda çeşitli başarılar elde ettim. Sözde otomatik olarak eklenecek gibi görünüyor ve hata ayıklama gezgininde "Eklenmeyi bekliyor" olarak görünüyor, ancak hiçbir zaman eklenmiyor.

Bazen uzantı hedefimi Xcode'da çalıştırabiliyorum:

görüntü açıklamasını buraya girin

Ve sonra uzantımı hangi uygulamada çalıştıracağımı seçme seçeneğine sahip olun. Bu durumda, onun tavsiyesini "bugün", yani bildirim merkezi seçerdim.

görüntü açıklamasını buraya girin

Ve sonra bazen hata ayıklayıcıyı uzantıma eklerdi. Bu yöntemin yalnızca fiziksel cihazlarda çalıştığını unutmayın, öyle görünüyor.

Eklenmezse @ VinceYaun'un cevabındaki manuel ekleme yöntemini kullanabilirsiniz,

Diğer bağlanma yöntemlerini kullanarak da çeşitli başarılar elde ettim. Çoğu başarısız oldu ve daha sonraki bir tarihte düzeltilecek olan hatalar gibi görünüyor.

Günlük mesajlarınızı görüntülemek için üst çubukta Window-> Devicesseçeneğine gidin ve cihazınızı seçin. Aygıt günlüğünü o pencerenin altından getirebilirsiniz. Bir simülatör üzerinde test yapıyorsanız, @ BalestraPatrick'in cevabını kullanabilirsiniz .

Bazı hatalar Beta 2'de düzeltildi ve tahminim, uzantıyı başlatırken hata ayıklayıcının sonunda otomatik olarak ekleneceği.

Güncelleme: iOS 8 Beta 4 sürüm notlarında :

Uzantılar

Beta 4'te düzeltildi

  • Xcode'dan hata ayıklarken uzantılar bazen başlatılamaz.
  • Kullanıcı Arabirimli Uzantı öldürüldüğünde, yeniden başlatılır ve kapatılmaz.
  • Bazen Paylaşım veya İşlem uzantınız kilitlenebilir.
  • Bir uzantıyı yeniden dağıtmak, onu Bildirim Merkezi'nde devre dışı bırakabilir.

Depolama Uzantıları için aynı yaklaşımı denediniz mi?
SRP-Achiever

Xcode 6 beta 2'de benim için işe yaramadı, ancak Vince Yuan cevabı işe yaradı . Ne yazık ki, Xcode 6 beta 3 uzantısında hata ayıklama benim için hiç çalışmıyor. Bu soruna çözüm bulamadım, muhtemelen bir sonraki sürümü beklememiz gerekiyor.
Darrarski

@Darrarski Cevabım Beta 1'den kaldı. Bilginize, Beta 3 çıktı, bu yüzden şimdiye kadar onda olmalısınız.
Noel Baba

@SantaClaus oldukça açık. Yorumum, verilen çözümlerden hiçbirinin benim için Xcode 6 beta 3'te çalışmadığını bildirmekti. Görünüşe göre uzantı hata ayıklaması bu sürümde daha da bozuk. Umarız bir sonraki beta sürümü sorunu çözer.
Darrarski

3
Bu hataların hiçbiri bana beta 4'te (şimdi beta 5) düzeltilmiş görünmedi.
mat

18

Ben de bu sorunu yaşıyorum. Xcode hiçbir zaman hata ayıklayıcımı uzantıya eklemiyor veya NSLog mesajlarını görüntülemiyor. Xcode hata ayıklayıcınızı uzantı sürecinize manuel olarak eklerseniz, en azından kesme noktaları bir cazibe gibi çalışır:

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

5
Bununla karışık şansım oldu.
Noel Baba

2
upvote, ancak her zaman çalışmıyor, umarız apple gelecekteki sürümlerde uzantılara hata ayıklayıcıyı otomatik olarak ekler.
Jing

14
  1. Uzantınız için şema oluşturun
  2. Şema çalıştır
  3. Bir iletişim kutusunda kapsayıcı uygulamasını seçin
  4. Zevk almak

Benim için çalışıyor :)


Bu tam olarak ihtiyacım olan şey
pob21

1
NSLogyalnızca kapsayıcı uygulamasını çalıştırıyorsanız çalışır. Bu alışkanlık yerine kabın app-uzantısını çalıştırıyorsanız çalışır.
JaredH

Bu benim için de çalıştı. Teşekkürler Maciek Czarnik! Yukarıdaki çözümler benim için işe yaramadı. Xcode 8.1 kullanıyorum.
plam4u

5

Xcode 8, uzantılarda hata ayıklayabilir:

  1. Durdur düğmesinin yanındaki açılan kutudaki uzantı şemasını seçin ve çalıştırın.
  2. Görünen iletişim kutusunda ana uygulamayı seçin.

Sonuç: kesme noktaları ve günlük her zamanki gibi çalışır.


2
Today uzantısı benim durumumda çalışmıyor. CLANG hatası alınıyor: ld: kütüphane -lRPush için bulunamadı clang: hata: linker komutu çıkış kodu 1 ile başarısız oldu (çağrıyı görmek için -v kullanın)
BadmintonCat

Bu alakasız bir hatadır. Eksik bir kitaplığa bağlanmaya çalışıyorsunuz. Hedefinize Liferay-Push ekleyin.
Jano

4

Sonunda Michael'ın önerisine ve Apple'ın belgelerine dayanarak hata ayıklama alanındaki günlüğü görmeme izin veren şey şuydu :

Uygulama uzantısını simülatörde Oluşturun ve Çalıştırın ve bir ana makine uygulaması istendiğinde , uzantıyı arayacağınız belirli uygulamayı seçin . Benim durumumda, PDF'de bir paylaşım sayfası çekerek Eylem uzantımı Safari'den başlatıyordum.

Daha önce işe yaramayan şey, başkalarının ev sahibi olarak Today'i kullanma önerilerini takip etmek, ancak daha sonra bu uygulamayı bırakıp uzantımı aramak için Safari'ye gitmekti. Artık uzantıyı çalıştırmadan önce içeren uygulamamı çalıştırmam bile gerekmiyor.

Apple'ın Belgelerinden:

Uzantı düzeninizin Çalıştırma aşamasında, çalıştırılabilir olarak bir ana bilgisayar uygulaması belirtirsiniz. Uzantıya belirtilen ana bilgisayarın kullanıcı arabirimi üzerinden erişildiğinde, Xcode hata ayıklayıcı uzantıya eklenir.



1

Benim için işe yarayan bir numara (oldukça çirkin olsa da), UILabeluzantımın alt köşesine bir kukla yerleştirmektir . Ben genellikle onu çağırırım logLabel. Böylece, bu etiketin metnini, günlüğe kaydetmek istediğiniz herhangi bir günlük ifadesi ile güncellemek mümkündür. Farklı sınıfların örneklerinden gelen ifadeleri günlüğe kaydetmeniz gerekiyorsa bu tür bir yaklaşım pek iyi değildir. Ve açıkçası, kullanıcı arayüzünüzü karıştırıyor.

Ancak, oldukça basit bir widget'ınız varsa ve kullanıcı arayüzünün hafif dağınıklığını önemsemiyorsanız, bu hile yapar. Bu tartışmada belirtilen diğer tüm çözümleri denedim ve ne yazık ki hiçbiri benim için işe yaramadı.


1

Hata ayıklamanın benim için çalışmasının tek yolu Debug-> Attach To Process By PID veya Name'i seçmektir. Sonra uzantı adını değil PID'yi girin . PID'yi uzantıyı bir cihazda çalıştırarak bulabilirsiniz, Pencere-> Cihazlar'a gidin. Cihazınızı bulun ve konsolu görüntüleyin. Dahili numaranızın adını gördüğünüzde, onu 5 haneli numara takip eder. Bu PID'dir

Ayrıca PID'yi de bulmak için uzantıya bir sürü NSLog koydum. Bu xCode 7'de


1

Uzatma NSLogve kırılma noktaları için aynı problemle karşılaşın . Bununla günlerce savaştım.

Device logaşağıdaki görüntü olarak bulunabilir. Adresinde XCode -> Window -> Devices and Simulators.

'A girdikten sonra Open Console, iletişim kutusunun sağ üst köşesinde bir arama alanı vardır. Orada filtre kuralı uygulayabilirim. Örneğin, bir işlem adı Notificationanahtar sözcük içerir veya işlem adı uzantı hedefinin adına eşit olmalıdır, örn: MyNotificationServiceExtensionişlem adına eşittir .

Cihaz günlüğü


0

Açıkçası Xcode6-B5'te bir şey bozuk.

Simülatörde bir Fotoğraf uzantısı çalıştırmaya çalışırsam, uzantı ekleme işlemi için herhangi bir Photos.app seçeneği göremiyorum.

simülatördeki hata ayıklama seçenekleri

Aynı şey, gerçek bir cihazda çalışmak bana doğru davranışı veriyor.

gerçek bir cihazla hata ayıklama seçenekleri

İlk durumda herhangi bir kırılma noktası kabul edilmez. İkinci durumda, kesme noktaları bir cazibe gibi çalışır.


0

LLVM her seferinde yalnızca bir iş parçacığında hata ayıklarken, kapsayıcı uygulaması ve uzantısının iOS'ta tamamen iki farklı işlem olduğunu bilmelisiniz, bu nedenle, hata ayıklama yaparken konsol uzantıyı hiçbir zaman günlüğe kaydetmez ve kesme noktasında durmaz.

Sorunların çoğunu @ Vince Yuan yöntemi ile çözebilirsiniz.

Ancak benim sorunum, Xcode hata ayıklayıcısının hem iOS Simulator'da hem de cihazlarda klavye uzantıma neredeyse hiç takılmaması, örneğin 7-8 çalıştırmada 1 kez olduğu gibi, Bu tamamen bir olasılık meselesi. @ Vince Yuan yöntemi de bazen işe yarıyor.

Benim küçük deneyimim, hata ayıklama şemasını çalıştırdığınızda, sol paneldeki hata ayıklama Oturumu 'Hata Ayıklama Oturumu Yok' ifadesini gösteriyorsa, uzantınızı açıp test etmenize gerek yoktur, hata ayıklayıcı devreye girmedi, sadece çalıştırın yine şanslı için.

ancak com.xxx.xxx.xxx'in Eklenmeyi beklediğini gördüğünüzde, uzantı kesinlikle hata ayıklanabilir.

Bu, iOS uzantısında, özellikle klavye uzantısında hata ayıklayamayanlar için küçük bir numaradır.


0

Xcode 6 Beta 5 itibariyle, uzantımdaki hataları ayıklamak için iOS8 çalıştıran gerçek bir cihaz kullanabildim. Bir cihazda çalıştırmayı deneyin ve başlatmak için Safari'yi seçin.


0

Sürekli değişen IDE'nin neden olduğu tüm durumların üstesinden gelmek için limonjar.com'un iOS Konsolu'nu kullanıyorum - işlem kimliğine bakılmaksızın bağlı herhangi bir iOS cihazı syslog mesajlarını işleyen bir konsol penceresi görüntüler. Hem uygulama hem de uzantı hata ayıklama günlüğü mesajlarını burada aynı anda görebilirsiniz.


0

Uzantımın hatalarını aşağıda açıkladığım şekilde ayıklayabilirim:

  1. Xcode : Debug-> Attach to process by PID or Name. Uzantı düzeninizin adı.
  2. Ardından seçin main app targetve çalıştırın.

Umarım sizin için de işe yarar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.