私はすべてのテストマシンで非常に安定していて、ほぼすべてのユーザーに対して安定しているように見えるマルチスレッドアプリを持っています(クラッシュの苦情がないことに基づいています)。ただし、クラッシュレポートを送信してくれた1人のユーザーにとって、アプリは頻繁にクラッシュします。すべてのクラッシュレポート(最大10個の連続したレポート)は基本的に同じように見えます。
Date/Time: 2010-04-06 11:44:56.106 -0700
OS Version: Mac OS X 10.6.3 (10D573)
Report Version: 6
Exception Type: EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000002, 0x0000000000000000
Crashed Thread: 0 Dispatch queue: com.apple.main-thread
Thread 0 Crashed: Dispatch queue: com.apple.main-thread
0 com.apple.CoreFoundation 0x90ab98d4 __CFBasicHashRehash + 3348
1 com.apple.CoreFoundation 0x90adf610 CFBasicHashRemoveValue + 1264
2 com.apple.CoreText 0x94e0069c TCFMutableSet::Intersect(__CFSet const*) const + 126
3 com.apple.CoreText 0x94dfe465 TDescriptorSource::CopyMandatoryMatchableRequest(__CFDictionary const*, __CFSet const*) + 115
4 com.apple.CoreText 0x94dfdda6 TDescriptorSource::CopyDescriptorsForRequest(__CFDictionary const*, __CFSet const*, long (*)(void const*, void const*, void*), void*, unsigned long) const + 40
5 com.apple.CoreText 0x94e00377 TDescriptor::CreateMatchingDescriptors(__CFSet const*, unsigned long) const + 135
6 com.apple.AppKit 0x961f5952 __NSFontFactoryWithName + 904
7 com.apple.AppKit 0x961f54f0 +[NSFont fontWithName:size:] + 39
(....詳細は次のとおりです)
まず、[NSFont fontWithName:size:]の調査に長い時間を費やしました。ユーザーのフォントがどういうわけか台無しになっているのではないかと思ったので、[NSFont fontWithName:size:]は存在しないものを要求していて、その理由で失敗していました。[[NSFontManager sharedFontManager] availableFontNamesWithTraits:NSItalicFontMask]を使用して一連のコードを追加し、フォントの可用性を事前に確認しました。残念ながら、これらの変更では問題は解決しませんでした。
_NSLockError、[NSException raise]、objc_exception_throwなどのデバッグブレークポイントを削除するのを忘れていることに気づきました。ただし、アプリは間違いなく「リリース」をアクティブなビルド構成として使用してビルドされました。「リリース」構成を使用すると、ブレークポイントの設定が妨げられると思いますが、ブレークポイントがどのように機能するか、またはブレークポイントを有効にするためにプログラムをgdb内から実行する必要があるかどうかはわかりません。
私の質問は次のとおりです。ブレークポイントを設定したままにしたことが、ユーザーが観察したクラッシュの原因である可能性がありますか?もしそうなら、なぜブレークポイントはこの1人のユーザーだけに問題を引き起こすのでしょうか?そうでない場合、他の誰かが[NSFont fontWithName:size:]で同様の問題を抱えていますか?
ブレークポイントを削除してユーザーに送り返すことを試みるかもしれませんが、そのユーザーにどれだけの通貨が残っているかわかりません。そして、ブレークポイントを設定したままにしておくと問題が発生する可能性があるかどうかをより一般的に理解したいと思います(アプリが「リリース」構成を使用して構築されている場合)。