5

そのため、この非常に奇妙で厄介な問題に数日間立ち往生しています。iOS アプリ ストアにリリースしたアプリがあり、最近戻ってアプリケーションにいくつかの追加機能を追加しました。アプリのコアには触れず、Twitter、Facebook、アプリ内購入、Google admob (フル バージョンに基づく無料バージョン) などを追加しました。ここで、奇妙なことが起こります。アドホック リリース ビルドを作成し、iphone 3gs、4s、ipad 2 でテストしたアップデートをテストしました - まったく問題ありません。私はアップルにアップデートを提出し、彼らはアップデートを承認し、リリースされました。アプリケーションを更新して実行しようとすると、スプラッシュ画面の直後にブームがクラッシュします (ここでも何も変更されていません)。私のプロジェクトでは cocos2dx フレームワーク (バージョン cocos2d-2.0-x-2.0.4 @ 2012 年 11 月 2 日) を使用し、cocosbuilder (2.1) を使用しています。ログを確認したところ、CCBReader::readFloat() 関数内の不整合の問題のようでした。ここにこれに対する修正があることがわかりました:https://github.com/DarraghCoy/cocos2d-x/commit/34b31fd754778f815fcac108089e3fe015e2e2b9 .

そこで、デフォルトのケースも次のように変更しました。 float CCBReader::readFloat() { unsigned char type = this->readByte();

        switch (type) {
            case kCCBFloat0:
                return 0;    
            case kCCBFloat1:
                return 1;
            case kCCBFloatMinus1:
                return -1;
            case kCCBFloat05:
                return 0.5f;
            case kCCBFloatInteger:
                return (float)this->readInt(true);
            default:
                {
                    /* using a memcpy since the compiler isn't
                     * doing the float ptr math correctly on device.
                     * TODO still applies in C++ ? */
                    float * pF = (float*)(this->mBytes + this->mCurrentByte);
                    float f = 0;

                    memcpy( &f, pF, sizeof(float));
                    this->mCurrentByte += 4;

                    return f;
                }
        }
    }

これに:

    float CCBReader::readFloat() {
        unsigned char type = this->readByte();

        switch (type) {
            case kCCBFloat0:
                return 0;    
            case kCCBFloat1:
                return 1;
            case kCCBFloatMinus1:
                return -1;
            case kCCBFloat05:
                return 0.5f;
            case kCCBFloatInteger:
                return (float)this->readInt(true);
            default:
                {
                    /* using a memcpy since the compiler isn't
                     * doing the float ptr math correctly on device.
                     * TODO still applies in C++ ? */
                    float * pF = (float*)(this->mBytes + this->mCurrentByte);
                    float f = 0;

                    memcpy((void*) &f, (const void*) pF, sizeof(float));

                    this->mCurrentByte += sizeof(float);


                    return f;
                }
        }
    }        

デバイスでリリースビルドを再度テストしても問題はありません。私はこの修正をアップルに提出し、アプリケーションがクラッシュする代わりに実行され、1 日以内にアップルの承認を得て出荷されるように迅速なレビューを要求しました。新しいバージョンの起動に更新すると、再びクラッシュします。

クラッシュ ログのコピーを次に示します。

Incident Identifier: DCFEA2A4-9707-4FF7-A4B7-26CF61B4A73F
CrashReporter Key:   b91e2f134184158618753244f837ff2ac5114f0d
Hardware Model:      iPhone4,1
Process:         GAMEAPP [848]
Path:            /var/mobile/Applications/F860F02C-3D16-4995-A19F-CE036200209F/GAMEAPP.app/GAMEAPP
Identifier:      GAMEAPP
Version:         ??? (???)
Code Type:       ARM (Native)
Parent Process:  launchd [1]

Date/Time:       2013-03-01 19:42:44.987 -0500
OS Version:      iOS 6.1.2 (10B146)
Report Version:  104

Exception Type:  EXC_BAD_ACCESS (SIGBUS)
Exception Codes: EXC_ARM_DA_ALIGN at 0x1f0807c9
Crashed Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   GAMEAPP                     0x000f971c cocos2d::extension::CCBReader::readFloat() (CCBReader.cpp:422)
1   GAMEAPP                     0x000f9e52 cocos2d::extension::CCBReader::readKeyframe(int) (CCBReader.cpp:648)
2   GAMEAPP                     0x000f99ae cocos2d::extension::CCBReader::readNodeGraph(cocos2d::CCNode*) (CCBReader.cpp:509)
3   GAMEAPP                     0x000f9c20 cocos2d::extension::CCBReader::readNodeGraph(cocos2d::CCNode*) (CCBReader.cpp:586)
4   GAMEAPP                     0x000f9342 cocos2d::extension::CCBReader::readFileWithCleanUp(bool) (CCBReader.cpp:689)
5   GAMEAPP                     0x000f92ec cocos2d::extension::CCBReader::readNodeGraphFromData(cocos2d::extension::CCData*, cocos2d::CCObject*, cocos2d::CCSize const&, cocos2d::extension::CCBAnimationManager**) (CCBReader.cpp:230)
6   GAMEAPP                     0x000f91aa cocos2d::extension::CCBReader::readNodeGraphFromFile(char const*, cocos2d::CCObject*, cocos2d::CCSize const&, cocos2d::extension::CCBAnimationManager**) (CCBReader.cpp:213)
7   GAMEAPP                     0x000f90a4 cocos2d::extension::CCBReader::readNodeGraphFromFile(char const*, cocos2d::CCObject*) (CCBReader.cpp:192)
8   GAMEAPP                     0x00119b50 IntroScene::init() (IntroScene.cpp:55)
9   GAMEAPP                     0x00119ca8 IntroScene::create() (IntroScene.h:19)
10  GAMEAPP                     0x00119a7c IntroScene::scene() (IntroScene.cpp:22)
11  GAMEAPP                     0x00110290 AppDelegate::applicationDidFinishLaunching() (AppDelegate.cpp:144)
12  GAMEAPP                     0x000dab94 cocos2d::CCApplication::run() (CCApplication.mm:50)
13  GAMEAPP                     0x000b6610 -[AppController application:didFinishLaunchingWithOptions:] (AppController.mm:76)
14  UIKit                           0x36522ad4 -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 248
15  UIKit                           0x3652265e -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1186
16  UIKit                           0x3651a846 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 694
17  UIKit                           0x364c2c34 -[UIApplication handleEvent:withNewEvent:] + 1000
18  UIKit                           0x364c26c8 -[UIApplication sendEvent:] + 68
19  UIKit                           0x364c2116 _UIApplicationHandleEvent + 6150
20  GraphicsServices                0x381d85a0 _PurpleEventCallback + 588
21  GraphicsServices                0x381d81ce PurpleEventCallback + 30
22  CoreFoundation                  0x3468f170 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 32
23  CoreFoundation                  0x3468f112 __CFRunLoopDoSource1 + 134
24  CoreFoundation                  0x3468df94 __CFRunLoopRun + 1380
25  CoreFoundation                  0x34600eb8 CFRunLoopRunSpecific + 352
26  CoreFoundation                  0x34600d44 CFRunLoopRunInMode + 100
27  UIKit                           0x36519480 -[UIApplication _run] + 664
28  UIKit                           0x365162fc UIApplicationMain + 1116
29  GAMEAPP                     0x000b6c22 main (main.m:14)
30  GAMEAPP                     0x000b6344 start + 36

Thread 1:
0   libsystem_kernel.dylib          0x3c8d5d98 __workq_kernreturn + 8
1   libsystem_c.dylib               0x3c823cf6 _pthread_workq_return + 14
2   libsystem_c.dylib               0x3c823a12 _pthread_wqthread + 362
3   libsystem_c.dylib               0x3c8238a0 start_wqthread + 4

Thread 2 name:  Dispatch queue: com.apple.libdispatch-manager
Thread 2:
0   libsystem_kernel.dylib          0x3c8c5648 kevent64 + 24
1   libdispatch.dylib               0x3c7f5974 _dispatch_mgr_invoke + 792
2   libdispatch.dylib               0x3c7f5654 _dispatch_mgr_thread$VARIANT$mp + 32

Thread 3:
0   libsystem_kernel.dylib          0x3c8d5d98 __workq_kernreturn + 8
1   libsystem_c.dylib               0x3c823cf6 _pthread_workq_return + 14
2   libsystem_c.dylib               0x3c823a12 _pthread_wqthread + 362
3   libsystem_c.dylib               0x3c8238a0 start_wqthread + 4

Thread 4 name:  WebThread
Thread 4:
0   libsystem_kernel.dylib          0x3c8c4eb4 mach_msg_trap + 20
1   libsystem_kernel.dylib          0x3c8c5048 mach_msg + 36
2   CoreFoundation                  0x3468f040 __CFRunLoopServiceMachPort + 124
3   CoreFoundation                  0x3468dd9e __CFRunLoopRun + 878
4   CoreFoundation                  0x34600eb8 CFRunLoopRunSpecific + 352
5   CoreFoundation                  0x34600d44 CFRunLoopRunInMode + 100
6   WebCore                         0x3a60a500 RunWebThread(void*) + 440
7   libsystem_c.dylib               0x3c82e30e _pthread_start + 306
8   libsystem_c.dylib               0x3c82e1d4 thread_start + 4

Thread 5 name:  AURemoteIO::IOThread
Thread 5:
0   libsystem_kernel.dylib          0x3c8c4eb4 mach_msg_trap + 20
1   libsystem_kernel.dylib          0x3c8c5048 mach_msg + 36
2   AudioToolbox                    0x3418391c AURemoteIO::IOThread::Run() + 104
3   AudioToolbox                    0x34185c84 AURemoteIO::IOThread::Entry(void*) + 4
4   AudioToolbox                    0x340c3882 CAPThread::Entry(CAPThread*) + 294
5   libsystem_c.dylib               0x3c82e30e _pthread_start + 306
6   libsystem_c.dylib               0x3c82e1d4 thread_start + 4

Thread 0 crashed with ARM Thread State (32-bit):
    r0: 0x1ed49740    r1: 0x1f0807c9      r2: 0x000001cd      r3: 0x000001c8
    r4: 0x00000004    r5: 0x1ed49740      r6: 0x42480000      r7: 0x2fd4af48
    r8: 0xffffffff    r9: 0x000001c9     r10: 0x1ed49740     r11: 0x1ed4a8a0
    ip: 0x000001c7    sp: 0x2fd4af48      lr: 0x000f9e57      pc: 0x000f971c
  cpsr: 0x00000030

Binary Images:

-lsqlite3.0 と -ObjC を含めるように他のリンカー フラグを変更しました (元は -lxml2 と -lz だけでした)。私のリリース ビルドの最適化は -Os (最速、最小) です。

他の誰かがこの問題を抱えていますか? 再現できないため、これをデバッグする方法がわかりません。最後に、アップルがアプリを承認したにもかかわらず、スプラッシュ画面の直後にクラッシュするのはどうしてですか? アプリの実行時に推測できれば、アプリの承認後に「App Store の処理中」ステージをスローしたときに壊れる可能性があります (不明)。

ありがとう!

4

5 に答える 5

2

CCBReader の EXC_BAD_ACCESS エラーに関するこの投稿は、まったく同じ問題を解決するのに役立ちました: http://www.cocos2d-x.org/boards/6/topics/18183

結局のところ、これは CCBReader のメモリのミスアライメントに関連していて、sim では問題なく動作しますが、デバイスでは ARM プロセッサが原因でクラッシュします。

于 2013-03-05T21:31:11.200 に答える
2

私は回避策を知っています。スキームを編集してビルドするかどうかを選択すると、爆発しないようですDebugRelease

私も2回断られました。トリックは、アプリの 1 つのバージョン (無料) が合格し、もう 1 つのバージョン (プレミアム) がクラッシュしたことです。その違いを追って、違いを確認しました。

CCBReader 2.0

@LearnCocos2D が述べたように、デバッグ/リリースの副作用はおそらく最適化です。


最適化の回避策:

  • ターゲットを選択します。
  • [ビルド フェーズ] タブを選択します。
  • [ソースのコンパイル] 項目を展開します。コンパイルされたすべてのファイルが一覧表示されます。上部に「コンパイラ フラグ」という 2 番目の列があることに気付いた場合。
  • CCBReader.m を選択
  • [コンパイラ フラグ] 列をダブルクリックします。
  • 「-O0」と入力

私の問題を解決しました。

于 2013-04-04T22:18:04.853 に答える
2

最後の方のあなたの発言に基づく私の最初の反応は、Apple が解決したと主張している「アプリ更新バグ」がまだ完全には解決されていないということです。更新中に追加される DRM パッチにより、更新されたアプリが開始直後に何らかの形でクラッシュします。 http://www.tuaw.com/2013/03/01/bug-in-latest-evernote-for-ios-update-causes-the-app-to-crash/ https://discussions.apple.com/スレッド/3389977?start=0&tstart=0 http://www.pcworld.com/article/258827/updated_apps_crashing_heres_what_you_need_to_know.html

アプリ アップデートのクラッシュ バグに関連して、同様の質問が多数寄せられています。いくつかのベスト プラクティスまたは回避策がありますが、Apple によって文書化されていませんが、更新のバグを回避することについて具体的に書かれています。それらをチェックしてください。それがあなたのアプリに固有のものでない場合、それらの1つはあなたのために運動するかもしれません.

更新されたアプリが iPad でクラッシュする 更新直後に iPhone アプリがクラッシュする

于 2013-03-04T03:56:18.340 に答える
0

私は「なんてCCBがそこでやっているの?」のようでした。....とにかく、-O3 を使用するか、最適化をまったく行わないでください。-Os は、特に cocos2d で微妙な問題を引き起こすことが知られています。-Os が cocos2d のデフォルト レベルではないのには理由があります (そして、Xcode テンプレートもそうだと思います)。

これで問題が解決した場合は、この質問の回答の 1 つを使用して、このファイルまたは関数に対してのみ最適化レベルを設定するか、最適化を無効にすることができます。

于 2013-03-03T09:28:13.253 に答える
0

ccbi ファイルを使用して UI を作成しています。クラスの init メソッドで参照変数を nullptr に設定していないため、ゲームがランダムにクラッシュします。

たとえば、Label *homeLabel; を宣言しました。intorScene.h ファイルでは、.cpp ファイルの init メソッドで、この変数を次のように設定する必要があります。

homeLabel = nullptr;

于 2016-06-08T10:21:31.203 に答える