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]);