Objective-C でスタックトレースを表示する
デバッグしてると「なんでこのタイミングでこのメソッドが呼ばれるんだ?」と思うときがある。そんなとき、スタックトレースを表示できるとルート確認ができて便利。
Java の場合 Exception をスローして表示してたけど、Objective-C の場合、出力したいところに NSThread の +callStackSymbols を埋め込んでおくだけ。処理もそのまま継続できるからデバッグでも重宝する。:-)
@implementation AsyncURLConnection ... - (void) cancel { ... NSLog(@"%@",[NSThread callStackSymbols]);
実行結果はこんな感じ。:-)
-[AsyncURLConnection cancel][105] ( 0 MyApp 0x00037cf1 -[AsyncURLConnection cancel] + 113 1 MyApp 0x0004b94d -[NodeSyncManager cancel] + 61 2 MyApp 0x00035e32 -[FileSyncManager cancelListUpdating] + 66 3 MyApp 0x0002aafa -[FileListViewController cancelFilesUpdating] + 90 4 MyApp 0x0002a9f3 __-[FileListViewController updateFiles:]_block_invoke_2 + 51 5 MyApp 0x0005250f -[IndicatorAlertView alertView:didDismissWithButtonIndex:] + 191 6 UIKit 0x00e7077f -[UIAlertView(Private) _popoutAnimationDidStop:finished:] + 911 7 UIKit 0x00aca499 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 519 8 UIKit 0x00aca584 -[UIViewAnimationState animationDidStop:finished:] + 73 9 QuartzCore 0x009bfe00 _ZN2CA5Layer23run_animation_callbacksEPv + 288 10 libdispatch.dylib 0x022de4f0 _dispatch_main_queue_callback_4CF + 327 11 CoreFoundation 0x01c53833 __CFRunLoopRun + 2003 12 CoreFoundation 0x01c52db4 CFRunLoopRunSpecific + 212 13 CoreFoundation 0x01c52ccb CFRunLoopRunInMode + 123 14 GraphicsServices 0x026ff879 GSEventRunModal + 207 15 GraphicsServices 0x026ff93e GSEventRun + 114 16 UIKit 0x00a99a9b UIApplicationMain + 1175 17 MyApp 0x000024b9 main + 121 18 MyApp 0x00002435 start + 53 )
おまけ
MyApp-Prefix.pch にマクロ定義しておくと便利 :-)
#define LogStackTrace NSLog(@"%@",[NSThread callStackSymbols]);