iOS - 调用dispatch_async时没有堆栈跟踪

时间:2013-08-22 13:00:21

标签: ios objective-c objective-c-blocks gcdasyncsocket

我已经创建了一些示例代码来演示我的问题。

- (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)

1 个答案:

答案 0 :(得分: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
}

您要调度的区块内的所有内容。虽然我确信有更好的方式!