*

iOSプログラミングのキモ(AppDelegate説明 デバッグをやりやすくするための工夫:NSSetUncaughtExceptionHandler )

公開日: : 最終更新日:2014/01/22 Apple, iOS, iPad, iPhone, XCode

デバッグはプログラミングを進めていく上で避ける事が出来ません。どうしてもバグは入ってきます。重要なのは できるだけ早く バグを見つけて修正する仕組みを用意することです。

NSSetUncaughtExceptionHandler関数は アプリが異常終了する直前に呼ばれる関数をセットする関数です。

/*
 exceptionHandler関数を AppDelegate に記述しておくと
 アプリが不正終了した場合に呼ばれるため 書いといた方が良いです。
*/
void exceptionHandler(NSException *exception)
{
    /*
     LOG関数は コンソールログを出力する関数 DEBUG時にとても有効です。
     別エントリーで解説します。
    */
    // 不正終了した箇所を示す スタックトレースをコンソールログに出力する
    LOG(@"stackSymbols:%@", [exception callStackSymbols]);
}

・・・・・・中略・・・・・・

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // アプリが異常終了した時に 呼ばれる関数を登録する 最初にやっておく
    NSSetUncaughtExceptionHandler(&exceptionHandler);
}

上記の例では、アプリ起動時 最初に呼ばれるメソッド didFinishLaunchingWithOptions の最初にNSSetUncaughtExceptionHandler関数を呼び出し、独自のエラーハンドラ exceptionHandler関数を登録しています。

exceptionHandler の中では 多く場合、エラーの原因を示すログをコンソールに出力する関数を呼び出します。例では LOG関数(実際にはマクロ 後述)の中でスタックトレース情報を出力しています。

以下にスタックトレースの例を示します。

2014-01-18 09:12:34.668 QTube[5857:70b] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array'
*** First throw call stack:
(
	0   CoreFoundation                      0x032505e4 __exceptionPreprocess + 180
	1   libobjc.A.dylib                     0x02fd38b6 objc_exception_throw + 44
	2   CoreFoundation                      0x031f14e6 -[__NSArrayM objectAtIndex:] + 246
	3   QTube                               0x000079e5 -[AppDelegate application:didFinishLaunchingWithOptions:] + 229
	4   UIKit                               0x02160355 -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 309
	5   UIKit                               0x02160b95 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1536
	6   UIKit                               0x021653a8 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 824
	7   UIKit                               0x0217987c -[UIApplication handleEvent:withNewEvent:] + 3447
	8   UIKit                               0x02179de9 -[UIApplication sendEvent:] + 85
	9   UIKit                               0x02167025 _UIApplicationHandleEvent + 736
	10  GraphicsServices                    0x040f52f6 _PurpleEventCallback + 776
	11  GraphicsServices                    0x040f4e01 PurpleEventCallback + 46
	12  CoreFoundation                      0x031cbd65 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53
	13  CoreFoundation                      0x031cba9b __CFRunLoopDoSource1 + 523
	14  CoreFoundation                      0x031f677c __CFRunLoopRun + 2156
	15  CoreFoundation                      0x031f5ac3 CFRunLoopRunSpecific + 467
	16  CoreFoundation                      0x031f58db CFRunLoopRunInMode + 123
	17  UIKit                               0x02164add -[UIApplication _run] + 840
	18  UIKit                               0x02166d3b UIApplicationMain + 1225
	19  QTube                               0x0000709d main + 141
	20  libdyld.dylib                       0x039e470d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

スタックトレースは上部のほうに不具合が発生した箇所が出力されます。上記の例では、7行目の didFinishLaunchingWithOptionsメソッド内で
Exceptionが発生しています。さらに、エラーメッセージから判断して、配列に存在しない番号の値を読み出そうとしたことがわかります。

ただ 根本的なバグの箇所は スタックトレースで示された箇所でないことが多いのですがスタックトレースで その根本原因に かなり近づくことが出来るようになります。

関連記事

iOSプログラミングのキモ(iOS7から使えるようになったマルチタスク機能、NSURLSessionUploadTask の困った現象)

このブログでも度々書いてきたFileQ iOS版ですが、今月末に Appleに申請できそうな

記事を読む

iOSプログラミングのキモ(複雑な画面を複数のViewControllerで制御する その2)

先週は、複数のViewControllerで1つの画面を構成する話のうち、親ViewControll

記事を読む

FileQ iOS版 公開しました。

5/2にFileQ iOS版を無事、公開しました。Appleの審査もスンナリ通り ホットしています(

記事を読む

iOSプログラミングのキモ

このブログでは、実際に弊社が公開しているアプリのソースコードを使って、iOSプログラミングのキモを解

記事を読む

iOSプログラミングのキモ(デバッグをやりやすくするための工夫:コンソール・ログの出し方 )

iOS上でプログラミングをする時、ログ出力用の関数としてNSLogという関数をよく使います。NSLo

記事を読む

iOSプログラミングのキモ(2:ソースコード概説 )XCode

iOSプログラミングでは Appleが提供している XCodeという開発ツールを使います。

記事を読む

iOSプログラミングのキモ(拡張子がpchというファイルの役目)

XCodeで プロジェクトを作成すると、-prefix.pch というファイルができています。このフ

記事を読む

iOSプログラミングのキモ(サードパーティ製ライブラリをサクッと入れるcocoapods)

iOSプログラミングでは 便利なライブラリがたくさんあります。特にUI系のライブラリは豊富で自分で作

記事を読む

iOSプログラミングのキモ(MainViewController説明 : dispatch_asyncとブロック構文を使った 今どきのお手軽マルチスレッドプログラミング)

TwitterやYouTubeといったサービスでは、コンテンツの見出しにサムネイルが付加されることが

記事を読む

FileQ iOS版を開発しようと思った理由

私の会社では FileQというファイル転送サービスを 2008年3月末から始めています、かれこれ6年

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

FileQ Hosting 月額99円 容量1GB


サイト管理 Mezzanine
Django上で動くCMS Mezzanine 用のモジュールを作ってみる その1

Django上で動くCMS Mezzanine上で動く、モジュールを作

ホーム Mezzanine
Django上で動くCMS Mezzanine を インストールする MacOSX Yesemite 編

Mezzanineは Django WEBフレームワーク上で動くCMS

EclipseにGWT(Google Web Toolkit) Plugin for Eclipseを入れようとしてハマった

最近PHPでちょっとした業務システムを作りました。業務システムの特徴と

ブログを半年やった成果を Google Analytics から眺める

今年の1月からブログを書き始め、そろそろ半年が経とうとしています。

母校で特別 講義をやってきました。

少し 間が空いてしまいました(^_^;) ちょっと前になりますが

→もっと見る

mautic is open source marketing automation
PAGE TOP ↑