2013-08-22 69 views
3

我創建了一些示例代碼來演示我的問題。iOS - 在調用dispatch_async時沒有堆棧跟蹤

- (void) test { 

    void (^handler)(void) =^{ 

     NSArray *test = [NSArray array]; 
     [test objectAtIndex: 5]; 
    }; 

    handler = [handler copy]; 

    dispatch_async(dispatch_get_main_queue(), handler); 
} 

當我調用測試方法時,我沒有得到堆棧跟蹤。調試器剛停在main.m並且此行突出顯示

int retVal = UIApplicationMain(argc, argv, nil, NSStringFromClass([FantasyUniversalAppDelegate class])); 

如果我刪除了dispatch_async並且只是調用handler();然後我得到一個堆棧跟蹤。有人可以解釋爲什麼這是,有沒有辦法獲得更具描述性的堆棧跟蹤?

現在我正在使用Flurry向我展示崩潰,但它向我展示的崩潰並不是非常有用,因爲我得到了一個非描述性堆棧跟蹤(它是符號化的)。它看起來像這樣:

Thread: Unknown Name 
0  libsystem_kernel.dylib    0x3a224eb4 mach_msg_trap + 20 
1  CoreFoundation      0x32067045 __CFRunLoopServiceMachPort + 129 
2  CoreFoundation      0x32065d5f __CFRunLoopRun + 815 
3  CoreFoundation      0x31fd8ebd CFRunLoopRunSpecific + 357 
4  CoreFoundation      0x31fd8d49 CFRunLoopRunInMode + 105 
5  GraphicsServices      0x35b9c2eb GSEventRunModal + 75 
6  UIKit         0x33eee301 UIApplicationMain + 1121 
7  IOSTestApp      0x00025d7b main (main.m:14) 
+0

我不是100%,但我認爲這是面對異常正在引發(「索引超出界限」),在主線程中被捕獲。您的處理程序()塊正在另一個線程上調用,因此捕獲的堆棧跟蹤對您沒有多大用處。當你只是調用處理程序()我是在主線程,所以沒有問題。至於解決方案,我會盡快回復你! –

+0

你可以將代碼包裝在 –

+0

謝謝,但是當它試圖給我的方法塊被調用但沒有告訴我行號。它只是說0 IOSTestApp 0x0003428d __56- [DetailController tableView:cellForRowAtIndexPath:] _ block_invoke + 173 – SukyaMaki

回答

0

您可以將所有你是調度塊內包裝你的代碼在

@try { 
    NSArray *test = [NSArray array]; 
    [test objectAtIndex: 5]; 
} 
@catch { 
    // Get the stack track for the current thread 
    NSArray *stacktrace = [NSThread callStackSymbols]; 
    // Do something with the symbols 
} 

。雖然我確定有更好的方法!