"EXC_BREAKPOINT (SIGTRAP)" istisnaları kesme noktalarında hata ayıklamadan mı kaynaklanıyor?


85

Tüm test makinelerimde çok kararlı olan ve neredeyse tüm kullanıcılarım için kararlı görünen (herhangi bir çökme şikayetine dayanmayan) çok iş parçacıklı bir uygulamam var. Uygulama, çökme raporları gönderecek kadar nazik olan bir kullanıcı için sık sık çöküyor. Tüm kilitlenme raporları (~ 10 ardışık rapor) temelde aynı görünüyor:

(.... daha fazla metin takip eder)

İlk olarak, [NSFont fontWithName: size:] 'i araştırmak için uzun zaman harcadım. Kullanıcının yazı tiplerinin bir şekilde bozulmuş olabileceğini düşündüm, bu yüzden [NSFont fontWithName: size:] var olmayan bir şey istiyordu ve bu nedenle başarısız oluyordu. Yazı tipi kullanılabilirliğini önceden kontrol etmek için [[NSFontManager sharedFontManager] availableFontNamesWithTraits: NSItalicFontMask] kullanarak bir sürü kod ekledim. Ne yazık ki, bu değişiklikler sorunu çözmedi.

_NSLockError, [NSException artış] ve objc_exception_throw dahil bazı hata ayıklama kesme noktalarını kaldırmayı unuttuğumu şimdi fark ettim. Ancak, uygulama kesinlikle aktif derleme yapılandırması olarak "Yayın" kullanılarak oluşturulmuştur. "Release" yapılandırmasını kullanmanın herhangi bir kesme noktasının ayarlanmasını engellediğini varsayıyorum - ancak yine de kesme noktalarının nasıl çalıştığından veya kesme noktalarının herhangi bir etkiye sahip olması için programın gdb içinden çalıştırılması gerekip gerekmediğinden tam olarak emin değilim.

Sorularım: Kullanıcı tarafından gözlemlenen çökmelerin nedeni, belirlenen kesme noktalarını bırakmış olabilir miyim? Öyleyse, neden kesme noktaları yalnızca bu tek kullanıcı için bir soruna neden olsun? Değilse, [NSFont fontWithName: size:] ile benzer sorunları olan başka kimse oldu mu?

Muhtemelen kesme noktalarını kaldırmayı ve kullanıcıya geri göndermeyi deneyeceğim, ancak o kullanıcıyla ne kadar para birimim kaldığından emin değilim. Ve daha genel olarak, kesme noktalarının bırakılmasının bir soruna neden olup olmayacağını anlamak istiyorum (uygulama "Yayın" yapılandırması kullanılarak oluşturulduğunda).

Yanıtlar:


189

"EXC_BREAKPOINT (SIGTRAP)" istisnaları kesme noktalarında hata ayıklamadan mı kaynaklanıyor?

Hayır. Aslında tam tersi: Bir SIGTRAP (izleme tuzağı), gerçek bir kesme noktasının yapacağı gibi hata ayıklayıcının programınızı kesmesine (kesintiye uğratmasına) neden olur. Ancak bunun nedeni, hata ayıklayıcının her zaman bir çökme durumunda kırılması ve bir SIGTRAP'ın (diğer birkaç sinyal gibi ) bir tür çökme olmasıdır.

SIGTRAP'ler genellikle NSExceptions'ın atılmasından kaynaklanır, ancak her zaman değil - birini doğrudan kendiniz yükseltmeniz bile mümkündür .

_NSLockError, [NSException artış] ve objc_exception_throw dahil bazı hata ayıklama kesme noktalarını kaldırmayı unuttuğumu şimdi fark ettim.

Bunlar kesme noktaları değil. Bunlardan ikisi işlevler ve -[NSException raise]bir yöntemdir.

Eğer breakpointler kastettiniz üzerinde olanlar işlevleri ve bu yöntemle?

"Release" yapılandırmasının kullanılmasının herhangi bir kesme noktasının ayarlanmasını engellediğini varsayıyorum.

Hayır.

Konfigürasyonlar, yapı konfigürasyonlarıdır. Xcode'un uygulamalarınızı nasıl oluşturduğunu etkiler.

Kesme noktaları, yapının bir parçası değildir; onları hata ayıklayıcıda ayarlarsınız. Sadece varlar, sadece isabet alıyorlar ve sadece programınızı hata ayıklayıcı altında çalıştırdığınızda programınızı durduruyorlar.

Yapının bir parçası olmadıklarından, kesme noktalarınızı bir kullanıcıya sadece uygulama paketini vererek iletmeniz mümkün değildir.

Ayrılma noktalarının tam olarak nasıl çalıştığından emin değilim ...

Programınız kesme noktasına ulaştığında, hata ayıklayıcı programınızı keser (kesintiye uğratır), bunun üzerine programın durumunu inceleyebilir ve programın nasıl yanlış gittiğini görmek için dikkatlice ilerleyebilirsiniz.

Programınızı durduran hata ayıklayıcı olduğundan, programınızı hata ayıklayıcı altında çalıştırmadığınızda kesme noktalarının hiçbir etkisi yoktur.

… Veya kesme noktalarının herhangi bir etkiye sahip olması için programın gdb içinden çalıştırılması gerekip gerekmediği.

Öyle. Hata ayıklayıcı kesme noktaları yalnızca hata ayıklayıcı içinde çalışır.

Sorularım: Kullanıcı tarafından gözlemlenen çökmelerin nedeni, belirlenen kesme noktalarını bırakmış olabilir miyim?

Hayır.

İlk olarak, belirtildiği gibi, bu kesme noktaları bir şekilde kullanıcının sistemine taşınsa bile, kesme noktaları yalnızca hata ayıklayıcıda etkilidir. Programınız hata ayıklayıcı altında çalışmıyorsa, hata ayıklayıcı bir kesme noktasında duramaz. Kullanıcı neredeyse kesinlikle uygulamanızı hata ayıklayıcı altında çalıştırmıyor, özellikle de çökme oturumu kapattığı için.

Onlar set bu kırılma noktalarının hepsi ile ayıklayıcı altında uygulamanızı kaçtın bile program ulaştığı nokta, bu kırılma noktalarının böylece bir sen ya Kakao sadece yangın denir ki, eğer zaman, bir kesme noktası isabet okunur _NSLockError, -[NSException raise]ya objc_exception_throw. O noktaya gelmek sorunun nedeni olmazdı, sorunun bir belirtisi olurdu.

Ve arananlardan birinin sonucu olarak çökme yaptıysanız, çökme günlüğünüzde en az birinin adı olacaktır. Öyle değil.

Yani, bu sizin kesme noktalarınızla ilgili değildi (farklı makine, hata ayıklayıcı dahil değil) ve bir Kakao istisnası değildi - bahsettiğim gibi, Kakao istisnaları SIGTRAP'lerin nedenlerinden biri, ancak tek nedeni bunlar değil. Farklı biriyle karşılaştın.

Değilse, [NSFont fontWithName: size:] ile benzer sorunları olan başka kimse oldu mu?

Karşılaştığımız sorunların benzer olup olmadığını anlamamızın bir yolu yok çünkü çökme günlüğünü kestiniz. Kazanın hangi bağlamda olduğu hakkında hiçbir şey bilmiyoruz.

Kesilmesi iyi olan tek şey "İkili görüntüler" bölümüdür, çünkü dSYM paketleriniz bizde yok, bu da bu bölümü kilitlenme günlüğünü sembolize etmek için kullanamayacağımız anlamına geliyor.

Öte yandan sen yapabilirsin. Bu amaçla bir uygulama yazdım ; çökme günlüğünü ona besleyin ve dSYM paketini otomatik olarak algılamalı (dağıttığınız her Sürüm derlemesi için dSYM paketini tutuyorsunuz, değil mi?) ve işlev ve yöntem adlarınızı işlevleriniz ve yöntemleriniz nerede görünürse görünsün yığın izine geri yükleyin.

Daha fazla bilgi için Xcode Hata Ayıklama Kılavuzu'na bakın .


3
Vay canına, kapsamlı cevap için teşekkürler. • "Bu işlevler için kesme noktaları belirlediğinizi mi söylediniz ..." Evet, bunu kastetmiştim. • "Kesme noktaları yapının bir parçası değildir ... Yalnızca var olurlar, yalnızca vurulurlar ve yalnızca programınızı hata ayıklayıcı altında çalıştırdığınızda programınızı durdurur" Teşekkürler, tam olarak bilmek istediğim şey buydu. • "kilitlenme günlüğünü sembolize edin ... Bu amaçla bir uygulama yazdım" Güzel uygulama. Genelde katıksız sezgilerimle "sembolize ederim" - ancak uygulamanız daha iyi bir yol! • Bunun kullanıcının yazı tipiyle ilgili bir sorun olması gerektiği sonucuna vardım ve bu bakış açısıyla üzerinde çalışacağım.
Dennis

7

Bu kullanıcının bozuk bir yazı tipine sahip olması çok muhtemeldir. Yığın izleme, yalnızca bir kullanıcıyı etkilediği gerçeği gibi, bu hipotezi kesinlikle destekler.

Bu durumda, kullanıcının rahatsız edici yazı tipini kaldırması dışında yapabileceğiniz pek bir şey yoktur, çünkü meydana gelen çökmeler Apple'ın kodunun derinliklerinde meydana gelir.

Kullanıcıya Font Book'ta bir font doğrulaması yaptırmayı deneyin. Bunu yapmak için Font Book'u başlatın , kaynak listesindeki Tüm Fontlar'a tıklayın ve ardından listelenen tüm fontları seçin. Daha sonra seçebilir doğrula Fonts'u dan Dosya menüsünden.


1
Yazı Tipi Kitabı hakkındaki bu ipucu için teşekkürler - Yazı Tipleri hakkında çok az şey biliyorum ve aslında kendi yazı tiplerimi doğrularken ilginç bir zaman geçirdim ... Kullanıcıya bunu denemesini önereceğim.
Dennis

0

Kesme noktaları ikiliye yazılmaz. Muhtemelen, bu kişinin bozuk bir işletim sistemi kurulumuna sahip olması iyidir. Dyld mesajlar için konsol günlüklerini kontrol edin.


Bu hızlı cevap için teşekkürler! Googling'de bu sorunun etrafında başkalarının dyld mesajlarıyla ilişkili EXC_BREAKPOINTS olduğunu fark ettim - ancak çökme günlüklerim dyld'den herhangi bir mesaj göstermiyor.
Dennis

0

Ben de aynı hatayı aldım. Açıklanamayan bir nedenle, EXC_BREAKPOINT istisnasının atılmasından kesme noktası sorumluydu . Çözüm, kesme noktasını kaldırmaktı ve ardından kod çalışır.

EXC_BREAKPOINT , hata ayıklayıcıların kullandığı bir istisna türüdür. Kodunuzda bir kesme noktası ayarladığınızda, derleyici çalıştırılabilir koda bu türden bir istisna ekler. Yürütme bu noktaya ulaştığında, istisna atılır ve hata ayıklayıcı onu yakalar. Daha sonra hata ayıklayıcı, kodunuzu "kesme noktalı" satırda gösterir. Hata ayıklayıcılar böyle çalışır. Ancak bu durumda, hata ayıklayıcı istisnayı doğru şekilde işlemez ve normal bir istisna hatası olarak sunulur.

Bu hatayı hayatımda iki kez buldum:

  • Yaklaşık bir yıl önce Xcode kullanan biri.
  • diğeri ise yaklaşık 15 yıl önce Visual C ++ kullanıyordu.

Bu hatayı herhangi bir kesme noktası olmadan almış olmam garip.
kelin

Bu hatanın yalnızca kesme noktalarında oluştuğunu söylemiyorum: EXC_BREAKPOINT birden çok nedenden dolayı olabilir. Açıkladığım şey, bir kesme noktasının işlenmemiş bir istisna oluşturduğu çok nadir görülen bir çift durum.
veladan
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.