

iOSアプリでPDFファイルの各ページをUIImageに変換する処理を作成しています。

iOS7まででは下記に示すコードで正常にPDFのページを取得・変換できているのですが、  
iOS8.1で実行したところCGContextDrawPDFPageの段階で原因不明のエラーとなってしまいます。

以下が主なコードになります。

[code]

    NSURL *url = [NSURL fileURLWithPath:pdfPath];
    
    CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((__bridge CFURLRef)url);
    
    
    CGPDFPageRef pageRef = CGPDFDocumentGetPage(pdf, 1);
    CGPDFPageRetain(pageRef);
    
    CGRect pageRect = CGPDFPageGetBoxRect(pageRef, kCGPDFMediaBox);
    
    UIGraphicsBeginImageContext(pageRect.size);
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    
    CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0);
    CGContextFillRect(context, pageRect);
    CGContextTranslateCTM(context, 0.0, pageRect.size.height);
    CGContextScaleCTM(context, 1.0f, -1.0f);
    CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
    CGContextSetRenderingIntent(context, kCGRenderingIntentDefault);
    
    CGContextDrawPDFPage(context, pageRef);
    
    CGContextRestoreGState(context);
    
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext();
    CGPDFPageRelease(pageRef);
    CGPDFDocumentRelease(pdf);
    
[/code]

~~iOS8からCoreGraphicsでPDFの扱い方に変更があったのでしょうか？  
もしよろしければ原因やヒントとなる情報をお持ちの方がいましたらご教示いただければ幸いです。~~

なお、iOS8でも、Xcodeから実行した際にはエラーとなるものの、  
ArchiveしてOTAで実機にインストールするとエラーが発生せず正常にPDFの取得・変換ができております。

つまり、  
・iOS8以上  
・Xcodeから実行  
・一部のPDFでのみエラーとなる  
という条件でエラーが発生しております。

Xcodeから実行した際と実機単体で実行した際で差分が発生する現象について、  
何か知見をお持ちの方がおりましたら、  
本現象と直接の関係がないことでも結構ですのでご教示いただけませんでしょうか？


CC BY-SA 3.0
2015-02-05T10:51:07.017
5995
2015-09-04T07:24:08.433
2015-04-02T07:58:58.987
3227
3227
question
ios objective-c xcode iphone pdf
Xcodeから実行するとCGContextDrawPDFPageでエラーが発生する


その後、エラー発生時のバックトレースを追ってみるなどして原因を探っていたところ、  
下記の質問の回答を参考にとりあえず **エラーを抑制する方法** が分かりました。  
<https://stackoverflow.com/questions/9683547/avaudioplayer-throws-breakpoint-
in-debug-mode>

要点をかいつまむと、  
C++領域の例外をスローしているので  
例外ブレイクポイントを利用することでC++の例外を無視してしまおう  
ということのようです。

  
  
具体的な手順としては、

1.CGContextDrawPDFPageの行を選択  
![手順1](https://i.stack.imgur.com/FjKcS.png)

2.例外ブレイクポイントを追加  
![手順２](https://i.stack.imgur.com/TOo9T.png)

3.監視対象？をObjective-Cのみとする  
![手順３](https://i.stack.imgur.com/HkTRP.png)

取り急ぎこの方法でArchiveせずともテストを行えるようになりましたので報告させていただきました。  
本件のように、バックトレースでlibc++絡みの例外が原因で不明なエラーが発生している場合、同様の方法で **とりあえずの抑制** ができるかもしれません。  
  
  
とはいえ、根本的な原因は未だ分からない状態ですので引き続き調べてみたいと思います。  
今回の発見で、どうやらC++の領域での例外が原因の可能性が高いというところまでは分かったので、そちらの方向で探ってみようと思います。


CC BY-SA 3.0
2015-04-07T02:38:55.703
8844
2015-04-07T02:38:55.703
2017-05-23T12:38:56.467
-1
3227
5995
answer