3

非常に特定のシナリオで「時間内に再開できませんでした」クラッシュ(ウォッチドッグ関連であると想定)が発生します。バックグラウンドから再開する場合、およびバックグラウンドに移動してから非常に短い時間内に再開する場合のみ(せいぜい数秒)。

これは、関連するクラッシュログのようです。

Incident Identifier: E30F2238-5B15-49A1-BCBC-386791AC93FA
CrashReporter Key:   84f4fb61c9e5c597750146695fffdc55f7273fb7
Hardware Model:      iPod4,1
Process:         XXXXXXX
Path:            /var/mobile/Applications/DE774CCE-D452-418D-A862-4562A0E5F1D0/XXXXXXX.app/XXXXXXX
Identifier:      XXXXXXX
Version:         ??? (???)
Code Type:       ARM (Native)
Parent Process:  launchd [1]

Date/Time:       2013-01-14 13:15:41.955 +0200
OS Version:      iOS 6.0 (10A403)
Report Version:  104

Exception Type:  00000020
Exception Codes: 0x000000008badf00d
Highlighted Thread:  0

Application Specific Information:
XXXXXXX failed to resume in time

Elapsed total CPU time (seconds): 9.140 (user 9.140, system 0.000), 91% CPU 
Elapsed application CPU time (seconds): 7.806, 78% CPU

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0:
0   libsystem_kernel.dylib          0x336fa7cc fsync + 8
1   Foundation                      0x3a444974 _NSWriteBytesToFileWithExtendedAttributes + 668
2   Foundation                      0x3a4446ce _NSWriteBytesToFile + 22
3   Foundation                      0x3a4446ac -[NSData(NSData) writeToFile:atomically:] + 80
4   XXXXXX                          0x001777ee 0xe3000 + 608238
5   CoreFoundation                  0x38361034 _CFXNotificationPost + 1424
6   Foundation                      0x3a437d8c -[NSNotificationCenter postNotificationName:object:userInfo:] + 68
7   Foundation                      0x3a43b84e -[NSNotificationCenter postNotificationName:object:] + 26
8   XXXXXX                          0x000e6616 0xe3000 + 13846
9   UIKit                           0x37e050e4 -[UIApplication _handleApplicationSuspend:eventInfo:] + 780
10  UIKit                           0x37d7b1ea -[UIApplication handleEvent:withNewEvent:] + 2454
11  UIKit                           0x37d7a6d0 -[UIApplication sendEvent:] + 68
12  UIKit                           0x37d7a11e _UIApplicationHandleEvent + 6150
13  GraphicsServices                0x3600d5a0 _PurpleEventCallback + 588
14  GraphicsServices                0x3600d1ce PurpleEventCallback + 30
15  CoreFoundation                  0x383e5170 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 32
16  CoreFoundation                  0x383e5112 __CFRunLoopDoSource1 + 134
17  CoreFoundation                  0x383e3f94 __CFRunLoopRun + 1380
18  CoreFoundation                  0x38356eb8 CFRunLoopRunSpecific + 352
19  CoreFoundation                  0x38356d44 CFRunLoopRunInMode + 100
20  GraphicsServices                0x3600c2e6 GSEventRunModal + 70
21  UIKit                           0x37dce2fc UIApplicationMain + 1116
22  XXXXXXX                         0x000e5cd0 0xe3000 + 11472
23  XXXXXXX                         0x000e5c6c 0xe3000 + 11372

これをデバッグしようとしましたが、デバッガーに接続したときに発生しないようです(そして、この問題に関して私が見つけたすべての関連情報は、デバッガーに接続したときにwacthdogが無効になっていることを示唆しています)。何が起こっているかに従ってみてください。

関連するすべてのAppDelegateメソッド(、、、、applicationWillResignActiveさらには)applicationDidEnterBackgroundにログを追加しましたがapplicationWillEnterForeground、バックグラウンドから戻ったときにログが取得されず、バックグラウンドに移動したときにのみログが取得されました。一部のプロセスは、アプリが指定された時間バックグラウンドにある場合でも再開できるようにディスパッチできることを理解していますが、そのようなプロセスを自分で実行することはありません。おそらくFacebookSDKはそのようなことをしますが、私もそれへの参照を見つけることができず、クラッシュログは何も示していません。applicationDidBecomeActiveapplicationWillTerminate

私はここで少し途方に暮れています、そしてどんなプッシュまたは正しい方向へのナッジさえもいただければ幸いです。

4

2 に答える 2

7

はい、これはウォッチドッグ関連です。

メインスレッドでの書き込みプロセスに時間がかかりすぎて、メインスレッドをブロックしている可能性はありますか?これは、バックグラウンドから戻ったときにログデータが表示されない理由と、バックグラウンドに戻った直後に再開した場合にのみ発生する理由を説明しています。

次のことをお勧めします。

  1. メインスレッドではなく、バックグラウンドタスクを使用してバックグラウンドに入るときにデータを書き込む:

    [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{...

  2. そのバックグラウンドタスクがまだ実行されている間にアプリが再開する場合は、それに応じて動作します。たとえば、書き込みが完了するまで読み取らないか、まだ書き込み中の場合は再度書き込みを行わないでください。だからあなたはあなた自身の状態を意識する必要があります

最大のルール:メインスレッドをブロックしないでください。1秒未満の時間がかかる場合があります。それらすべてをバックグラウンドスレッドに移動するか、このシナリオではバックグラウンドタスクに移動します。

于 2013-01-16T13:29:33.097 に答える
0

アプリがクラッシュしているスレッドを見つけて、そのスレッドを入れます dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ dispatch_async(dispatch_get_main_queue(), ^{ // run that crashing thread here. }); });

于 2015-09-24T11:27:26.857 に答える