2

次のクラッシュレポートで立ち往生しています:

Date/Time:       2013-09-12 22:39:54 +0000
OS Version:      iPhone OS 6.1.3 (10B329)
Report Version:  104

Exception Type:  SIGSEGV
Exception Codes: SEGV_ACCERR at 0xa0000008
Crashed Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib                     0x39a3c564 _cache_getImp + 4
1   libobjc.A.dylib                     0x39a3e1d7 class_respondsToSelector + 31
2   CoreFoundation                      0x31b96605 objectIsKindOfClass + 37
3   CoreFoundation                      0x31b9635d __handleUncaughtException + 69
4   libobjc.A.dylib                     0x39a41a65 _objc_terminate() + 129
5   libc++abi.dylib                     0x3948e07b safe_handler_caller(void (*)()) + 79
6   libc++abi.dylib                     0x3948e114 std::terminate() + 20
7   libc++abi.dylib                     0x3948f599 __cxa_current_exception_type + 1
8   libobjc.A.dylib                     0x39a419d1 objc_exception_rethrow + 13
9   CoreFoundation                      0x31adcf21 CFRunLoopRunSpecific + 457
10  CoreFoundation                      0x31adcd49 CFRunLoopRunInMode + 105
11  GraphicsServices                    0x356a82eb GSEventRunModal + 75
12  UIKit                               0x339f2301 UIApplicationMain + 1121
13  Our App                             0x0003bc27 main (main.m:15)

このエラーの原因となっているバグを修正するためのさまざまな試みの後、PLCrashReporter から (ベータ テスターからのアドホック ビルドから) このクラッシュログを何度も受け取り続けています。さまざまな例外コードは、SIGSEGV/SEGV_ACCERR から SIGBUS/BUS_ADRALN、EXC_BAD_ACCESS/KERN_INVALID_ADDRESS までさまざまです。

iOS (armv7 および armv7s) でRapidjson ライブラリを使用しており、こちら (#8)で説明されているようにパディングを修正し、objective-c ランタイム関数を使用してランタイムにメソッドの実装を追加していますclass_addMethod(

私たちのコードベースは、一部の Obj-C++ と一部の C コードを含むほとんどの Objective-C コードで構成されています。手動で処理される Obj-C++ および C 部分を除いて、メモリ管理は ARC によって行われます。すべての malloc/free 呼び出しを調査し、libgmalloc を広範囲に使用してメモリの問題を特定しましたが、正しくないと思われるものは何もありません。

デバッグ モードまたはリリース モードではなく、このクラッシュ ログを自分で再現することはできませんが、ベータ テスターからこのクラッシュ ログが時々 (約 50 回の実行に 1 回) 送られてきます。私たちの製品は (できれば) すぐに多くの iOS デバイスで動作するようになるため、これは壊れたままにしておくことはできません。

多くのメモリ管理の記事を読んだ後、この問題はメモリの配置が悪いことが原因であると思われます。したがって、rapidjson がこのバグの原因であると思われます。iOS / armv7 でのメモリ アラインメントに関する知識が不足しているため、このクラッシュログを修正できません。誰かがiOSでこの件についてもっと説明してもらえますか? それとも、間違った場所を探していますか?これは別のメモリの問題ですか? 誰かが私を正しい方向に向けてくれることを願っています。

さらに情報が必要な場合は、喜んで提供します。注:JSONKitまたは別のライブラリを使用してrapidjsonを置き換えるため、回答を探しているわけではありません。ありがとう :)

4

2 に答える 2

1

まず、アドレス0xa0000008がずれているようには見えSEGV_ACCERRません。これは、アラインメントの問題ではなく、メモリ アクセス許可の問題 (sys/signal.h から) を意味します。

#define SEGV_ACCERR     2       /* [XSI] invalid permission for mapped object */

class_addMethod()を使用していて、メソッドの取得の一部である でクラッシュが発生したことを考えると、無効なポインタを に渡したか、後でその情報を上書きしたのでは_cache_getImp()ないかと、ほとんど根拠のない疑いがあります。class_addMethod()

malloc()ランタイム関数はコピーを作成しないため、グローバルまたは ed メモリのどちらを使用しているかを確認する必要があります。

次に、表示されているクラッシュは二次的なものです。トップレベルの例外ハンドラーの実行中にクラッシュしています_objc_terminate()が、これは以前の例外からプログラムを既に終了 () していますが、この場合は Unix シグナルではなく、Objective-C 例外です。 : objc_exception_rethrow().

したがって、たとえば例外のログから、最初にその主要なエラーを把握する必要があるでしょう (多くの場合、バックトレースだけでは十分ではありません)。

于 2013-09-13T15:07:43.267 に答える