Xcode, çökmeye neden olan satırı göstermiyor


126

Uygulamam her çöktüğünde Xcode, ana () işlevindeki UIApicationMain () çağrısını çökmeye neden olan satır olarak vurgular. Eskiden normal olan bazı durumlarda (örneğin bölümleme hatası), ancak uğraşmaya çalıştığım kilitlenme, konsola kaydedilen ayrıntılı bilgilerin bulunduğu basit bir SIGABRT'dir:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: Date)'

Xcode, satırı eski SDK'larla tam olarak göstermek için kullanılırdı, ancak Xocde 4.2'ye yükselttiğimden beri bu değişti. Xcode'un kazaya neyin neden olduğunu tam olarak bildiği (veya bilebilir), ancak yine de gerçek çizgiyi göstermediği açıktır. Bunun için herhangi bir düzeltme veya geçici çözüm var mı?


2
Release için mi derliyorsunuz? Öyleyse, şemayı Hata Ayıkla olarak ayarlamayı deneyin.
epatel

Ayrıca bazı xib'ler kötü olabilir ve programın kendi kaynak kodunuz dışındaki bir yerde çökmesine, dolayısıyla herhangi bir dosya göstermemesine neden olabilir. Hata, "Tarih" adlı bir sözlük anahtarı için bir sorunu
açıklıyor

1
Apple daha fazla test kullanıcısı
tutmalıdır

Yanıtlar:


301

Ayrıca tüm istisnalar için kesme noktaları ayarladığınızdan emin olmalısınız. Bu, Xcode'un istisnanın meydana geldiği satırda durmasına neden olacaktır. Aşağıdakileri yapın [Xcode 4'te]:

  1. Xcode'un sol tarafındaki Proje Gezgini'nde, kesme noktası gezginine tıklayın (neredeyse en üstteki düğme çubuğunun sağ tarafına kadar. Simge kalın bir sağ oka benziyor).

  2. Gezginin alt kısmındaki "+" düğmesini tıklayın.

  3. "İstisna Kesme Noktası Ekle" yi tıklayın.

  4. Yeni bir kesme noktası oluşturulacak. Gerektiği gibi yapılandırılmalıdır, ancak davranışını değiştirebilirsiniz.

  5. Projenizi çalıştırın ve istisnayı yeniden oluşturun.

Ayrıca bazı 3. taraf kitaplıklarına / çerçevelerine bağlantı verdiğinizi söylediniz. Bu çerçeveler içinde istisna meydana geliyorsa, kod derlendiğinden ve Xcode istisnaya neden olan satırı gerçekte size gösteremeyeceğinden zor zamanlar geçireceksiniz. Durum böyleyse ve kitaplıkları doğru kullandığınızdan eminseniz, bu kitaplıkların bakımcılarına bir hata raporu vermelisiniz.


4
Ben bir çaylağım ve neredeyse bir ay bu olmadan geliştim ... bu hayatımı değiştiriyor.
Jonny Burger

4
Arkadaşım sadece bu gönderiyi desteklemek için bir SO hesabına kaydoldu.
Alex Spencer

1
buna kitabımın elma kısmında yarım eşleştirme deniyor
ChuckKelly

1
Bunu yaptım ama yine de bir
boşlukta

1
Bu çalışır, ancak olumsuz yanı, artık hata ayıklama konsolunda istisnanın ayrıntılarını çıktı olarak vermemesidir. Böylece bu kesme noktasını KAPATABİLİR ve istisnanın ayrıntılarını ve izini görebilir, ancak NEREDE olduğunu göremeyebilir veya nerede olduğunu görmek için AÇIK duruma getirebilirim, ancak NEDEN olmadan. İkisine de nasıl sahip olunacağını bilen var mı?
Gabriel Jensen

27

Bu StackOverflow cevabındaki talimatları uygulamanız yeterlidir:

Zombileri Etkinleştir

Temel olarak, "Zombileri Etkinleştir" yapmanız yeterlidir. O zaman Xcode, soruna neden olan satırda kırılmalıdır.

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

(Kesinlikle hatta 2017 yılında, o şok edici olduğunu, Xcode hala bu varsayılan olarak kapalı bulunuyor. Neden olur değil soruna neden satır göreceksiniz? Ve "isteyen Zombi Nesneleri Enable " gerçekten mi?! Gerçekten mi?! Do Xcode yazarlar bunun yararlı bir isim olduğuna ve yeni geliştiriciler için herhangi bir anlam ifade edeceğine inanıyor musunuz? Xcode'un App Store'daki derecelendirmesinin her yıl ne kadar düşük olması iç karartıcı. Kimse dinlemiyor ...)


6
Xcode, şimdiye kadar kullandığım en kötü programlama ortamı.
Öğrenci

İlginç bulduğum şey (bir Visual Studio geliştiricisi olarak), Xcode'un şimdiye kadar kullandıkları en iyi ortam olduğu konusunda ısrar eden kaç Xcode geliştiricisiyle tanıştığım. Mantıklı, cana yakın ve yardımsever .. ama birkaç tuhaflıkla. Şimdi bile, Kasım 2019'da, Xcode'un App Store puanı 3.1 ve çoğu kişi ona 5 yıldız veya 1 yıldız veriyor. Kimse dinlemiyor ....
Mike Gledhill

10

Düzen akım şeması ve etkinleştirmek NSZombieEnabled, MallocStackLoggingve guard malloc. Ardından, Uygulamanız kilitlendiğinde, bunu gdb konsoluna yazın:

(gdb) info malloc-history 0x543216

Öğesine 0x543216neden olan nesnenin adresiyle değiştirin NSInvalidArgumentExceptionve size çok daha kullanışlı bir yığın izleme sunarak, çökmeye neden olan kodunuzun satırlarını göstermelidir.


1
Bunu denedim ve hata oluştu: 'bilgi' geçerli bir komut değil. Herhangi bir tavsiye?
achi

@EliGregory hata ayıklayıcınızın varsayılan lldb değil gdb olarak ayarlandığından emin olun. Bunu, çalıştır bölümünün altındaki Şema Düzenle menüsünde değiştirebilirsiniz.
chown

2

Bu davranışı yoğun şekilde optimize edilmiş kodda gördüm; hedefinizin optimizasyon düzeyini ve 3. taraf kitapların düzeyini kontrol etmek, ince ayar yapmak yardımcı olabilir. (LLVM 3.0 Optimizasyon seviyesi ayarı)

Hata ayıklama sembolleri mi üretiyorsunuz?


Kabul. Hata ayıklamaya çalışıyorsanız, yapı ayarlarınızda optimizasyon düzeyinin 0 (Optimizasyon Yok) olarak ayarlanması gerekir.
Carter

1

Bağlantının dışında bir dizin çökmesi oluşturmak için kod yazdım. Aşağıdakiler, atılan istisnadır.

2017-01-07 04:02:57.606 testABC[1694:52966] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSSingleObjectArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010e85cd4b __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x000000010e2be21e objc_exception_throw + 48
    2   CoreFoundation                      0x000000010e8b5c2f -[__NSSingleObjectArrayI objectAtIndex:] + 111
    3   testABC                             0x000000010dce962d -[ViewController ComplexFunction] + 61
    4   testABC                             0x000000010dce95db -[ViewController thirdFunction] + 43
    5   testABC                             0x000000010dce959b -[ViewController secondFunction] + 43
    6   testABC                             0x000000010dce955b -[ViewController firstFinction] + 43
    7   testABC                             0x000000010dce96c2 -[ViewController viewDidAppear:] + 50
    8   UIKit                               0x000000010ee28a6c -[UIViewController _setViewAppearState:isAnimating:] + 945
    9   UIKit                               0x000000010ee2b7da __64-[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:]_block_invoke + 42
    10  UIKit                               0x000000010ee29ac4 -[UIViewController _executeAfterAppearanceBlock] + 86
    11  UIKit                               0x000000010ec8d77c _runAfterCACommitDeferredBlocks + 653
    12  UIKit                               0x000000010ec7a273 _cleanUpAfterCAFlushAndRunDeferredBlocks + 566
    13  UIKit                               0x000000010ec9d757 __84-[UIApplication _handleApplicationActivationWithScene:transitionContext:completion:]_block_invoke_2 + 194
    14  CoreFoundation                      0x000000010e8016ac __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12
    15  CoreFoundation                      0x000000010e7e66f4 __CFRunLoopDoBlocks + 356
    16  CoreFoundation                      0x000000010e7e5e65 __CFRunLoopRun + 901
    17  CoreFoundation                      0x000000010e7e5884 CFRunLoopRunSpecific + 420
    18  GraphicsServices                    0x00000001126d9a6f GSEventRunModal + 161
    19  UIKit                               0x000000010ec80c68 UIApplicationMain + 159
    20  testABC                             0x000000010dce99df main + 111
    21  libdyld.dylib                       0x000000011174968d start + 1
    22  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

Dikkatlice okursanız First Throw call stack

0   CoreFoundation              0x000000010e85cd4b __exceptionPreprocess + 171
1   libobjc.A.dylib             0x000000010e2be21e objc_exception_throw + 48

0 and 1 çökmeden sonraki sistem süreçleridir.

 2   CoreFoundation             0x000000010e8b5c2f -[__NSSingleObjectArrayI objectAtIndex:] + 111

2 istisnaya neden olan satırdır.

3   testABC                     0x000000010dce962d -[ViewController ComplexFunction] + 61

3istisnanın atıldığı Sınıf adı ( ViewController) ve işlev naem ( ComplexFunction) olduğunu söyler .


4
Errr, tamam. Kesinlikle haklısın, ama bu arkadaşça mı? Herhangi bir modern (1990'lardan itibaren) geliştirme ortamında, bir istisna meydana geldiğinde, soruna neden olan çizgiye yönlendirilirsiniz. Oysa Xcode ... şey ... size bunun gibi bir yığın izi verir. Turbo Pascal bile bu kadar modası geçmiş değildi !!!
Mike Gledhill

4
Sözde "en iyi kullanıcı deneyimi" ile tanınan şirketin, son 20 yıldır tüm geliştiricilerin, bir istisnanın atıldığı ve ASSEMBLER'DA OLMAYAN satır numarasını görmeye alışkın olduğunun farkında olmaması çok saçma. Deliriyor muyum? Hayatım boyunca çalıştığım her dil satır numaraları veriyor. Hatta C veya C ++.
mylovemhz
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.