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

3
我创建了一些示例代码来演示我的问题。
- (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)

我不是100%确定,但我认为这与异常被引发(“索引超出范围”)并在主线程上捕获有关。您的handler()块在另一个线程上被调用,因此捕获的堆栈跟踪对您没有多大用处。当您只调用handler()时,它在主线程上,所以没有问题。至于解决方案,我会尽快回复您! - George Green
你可以将你的代码封装在一个 - George Green
谢谢,但是尝试那个方法会给我返回调用该块的方法,但不告诉我行号。它只是显示 0 IOSTestApp 0x0003428d __56-[DetailController tableView:cellForRowAtIndexPath:]_block_invoke + 173。 - SukyaMaki
抱歉,这是当您尝试在其周围放置try/catch时发生的吗? - George Green
1
你尝试过添加异常断点吗?就像这个答案中所示:http://stackoverflow.com/questions/18336920/strange-crash-nsrangeexception-with-unhelpful-stacktrace/18338022#18338022 - George Green
1个回答

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
}

所有在您正在调度的代码块中。虽然我相信有更好的方法!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接