2012-10-03 18 views
28

アップルストアにアプリがあり、iOS6アップデート後にMKMapViewのクラッシュレポートが100件ありました。自分のデバイスでクラッシュを再現することはできません。それはEAGLContextの問題のようです。私たちのアプリではOpenGLを使用していませんが、異なるコントローラに複数のインスタンスMKMapViewがあります。 私は同じような問題をiOS 6 app crashes in EAGLContext when displaying mapsに見つけましたが、OpenGLを使用しています。iOS 6 MKMapViewがinitWithFrameでクラッシュする

ここでバックトレースがあります:

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

Thread 0 Crashed: 
0 libGPUSupportMercury.dylib   0x00000e22 gpus_ReturnNotPermittedKillClient + 10 
1 libGPUSupportMercury.dylib   0x3bccc5fb gldCreateContext + 190 
2 GLEngine       0x344c2b15 gliCreateContextWithShared + 676 
3 OpenGLES       0x0000491d -[EAGLContext initWithAPI:properties:] + 1433 
4 OpenGLES       0x000042d7 -[EAGLContext initWithAPI:sharedWithCompute:] + 143 
5 VectorKit       0x00011c81 -[VGLGPU init] + 105 
6 VectorKit       0x000d4659 __24+[VGLGPU sharedInstance]_block_invoke_0 + 49 
7 libdispatch.dylib     0x000014b7 _dispatch_client_callout + 23 
8 libdispatch.dylib     0x000073f7 dispatch_once_f$VARIANT$mp + 43 
9 VectorKit       0x00011c13 +[VGLGPU sharedInstance] + 39 
10 VectorKit       0x00001db1 -[VKMainLoop updateLinkState] + 485 
11 VectorKit       0x00001955 -[VKScreenCanvas _updateDisplayStatus:] + 109 
12 UIKit        0x0001c371 -[UIView initWithFrame:] + 129 
13 VectorKit       0x00010ca5 -[VGLScreenCanvas initWithFrame:context:] + 53 
14 VectorKit       0x00010a7d -[VKScreenCanvas initWithFrame:context:] + 57 
15 VectorKit       0x00010a3f -[VKScreenCanvas initWithFrame:] + 39 
16 VectorKit       0x000106bd -[VKMapCanvas initWithFrame:shouldRasterize:] + 65 
17 VectorKit       0x000104bb -[VKMapView initWithFrame:andGlobe:shouldRasterize:] + 647 
18 MapKit        0x0000dc95 -[MKMapView _commonInitAndEnableLoading:fromIB:] + 725 
19 MapKit        0x0000d811 -[MKMapView initWithFrame:] + 257 
..... 
+0

メモリリークが原因ではないと確信していますか?私も同様の問題が発生していますが、私はすでに原因を特定しています。 iOS 6のMKMapViewは、以前のバージョンよりも10倍のメモリを使います。私のアプリケーションはすべて地図上のものを表示することであり、そのフットプリントは30MBから280MBに増加しました。私はそれを解決しようとしていますが、まだ手掛かりはありません。 – Trein

+0

こんにちは@trein、例外はSIGSEGVですが、これは悪いメモリアクセスが原因であると私は理解しています。 – Breezeight

答えて

25

地図のサブビューを含むウィンドウをポップアップするのと同じように、ユーザーが私たちのアプリを背景にしているときにも同様の問題が発生していました。私たちがバックグラウンドになっている間、openGLコールを使ったマップのためクラッシュが起きているようです。我々は、次のようなチェックでマップサブビューの作成をラップする必要がありました:アプリがバックフォアグラウンドに来れば、我々は表示のためにサブビューを追加できるように私たちは、ブールをオフに保存されて

UIApplicationState appState = [[UIApplication sharedApplication] applicationState]; 
    if((appState != UIApplicationStateBackground) && (appState != UIApplicationStateInactive)) 
    { 
     // Do map subview initialization... 
    } 
    else 
    { 
     self.attemptedToLoadMap = YES; 
    } 

マップを操作して再描画操作(注釈の追加など)を行うたびに、この操作を行う必要があります。

+0

こんにちは@stuckj、あなたのクラッシュを修正しますか? – Breezeight

+0

承認を待っています... – stuckj

+0

アプリは週末に承認されました。そして、うん、それはそれに対処しているようだ。クラッシュレポートでそれ以上のレポートが表示されない – stuckj

2

私は同様のスタックトレースに直面しています。私は、実際の問題の詳細をコンソールに表示していることに気付きました。バックグラウンドでGPUを使用することはできません。 iOS 5のマップはタイルベースだったので、GPUを使用しないと仮定しましたが、iOS 6の新しいマップではベクターグラフィックス、したがってGPUを使用します。その結果、以前は使用していたマップ作業がなくなりました。

+0

こんにちは@hunterhacker、私はユーザーからこのスタックトレースを取得しています。自分のデバイスでクラッシュを再現することはできません。バグを再現するのを助けてくれますか? – Breezeight

+0

おそらくシミュレータがマップの生成にGPUを使用していないため、シミュレータで再作成できませんでした。バックグラウンドで実行中に新しいマップビューを作成しようとすると、新しいユーザーの場所についてコールバックを取得するたびに、トレースが確実に発生しました。答えるのが遅れて申し訳ありませんが、私はどのように答えに対するコメントが通知されるはずですが、私はそれを得ていませんでした。 – hunterhacker

3

http://developer.apple.com/library/ios/#qa/qa1766/_index.html

この技術QAアドレスこの問題

+2

私はOpenGLを使用しませんが、AppleはiOS 6マップ用です。おそらく、彼らはこの場合、独自のテクニカルQ&Aに従うべきでしょうか? Eek。 –

+0

単語の選択肢が不十分です。何が起こっているのかを少し説明していますが、Appleが提供したフレームワーク(MapKit)が責任を負う場合は、問題の「対処方法」については説明しません –

3

我々は、それが誰の助けになる場合ので、私は解決策を投稿したかった我々のアプリではこの原因を発見しました。私たちの主ビューコントローラは、表示されたときの重要な位置の変化を監視し、隠れているときの監視を停止します。ユーザーの何人かがこの画面で無関係のクラッシュを経験したため、アプリの監視が残りました。アプリが重要なロケーションの変更の更新を登録している場合、iOSは実際には新しいロケーションについて通知するために実行していない場合、バックグラウンドでアプリを起動します。私たちのアプリは最初に登場するときに地図を表示するので、クラッシュしました。 Appleのサポートにより、iOS 8.xを実行している32ビットデバイスに、アプリケーションがバックグラウンドにある間にMapView(または他のOpenGLコンテキスト)が更新された場合にクラッシュするバグがあることが確認されました。

私たちはコードが変更されたため、重要なロケーションの変更のためにアプリケーションが起動された場合、直ちに監視を停止し、アプリをクラッシュさせるための例外をスローします。これはユーザーには完全に見えないので、クラッシュに気付かず、クラッシュがさらに発生するのを防ぎます。

- (void)validateLaunchWithOptions:(NSDictionary *)launchOptions 
{ 
    if (launchOptions[@"UIApplicationLaunchOptionsLocationKey"]) { 
     // the app was launched due to a significant location change, which is not valid and causes crashes 
     // prevent this from happening again by disabling significant location monitoring 
     CLLocationManager *locationManager = [[CLLocationManager alloc] init]; 
     [locationManager stopMonitoringSignificantLocationChanges]; 

     // intentionally crashing the app here; it is not in a good state and it needs to be prevented from 
     // getting to any code that would re-enable significant location monitoring 
     @throw [NSException exceptionWithName:@"com.redacted.significantLocationLaunch" 
             reason:@"app may not be launched due to significant location changes" 
            userInfo:@{}]; 
    } 
} 

我々は何千人もこのクラッシュのを見ましたが、我々は原因を考え出しまで、我々のテストデバイス上でそれを複製することができませんでした。それを複製して(そして修正を確認したい場合)、アプリケーションが重要な場所の変更を監視し始めた直後に例外がスローされます。アプリがクラッシュした後、ドライブを起動します。携帯電話がセルタワーを切り替えるとすぐに、iOSがバックグラウンドでアプリを起動し、クラッシュします。ユーザーの携帯電話に手を差し伸べ、クラッシュログを調べることができました。彼女の通勤中や仕事中にクラッシュが起こった。

関連する問題