【问题标题】:iOS - No stack trace when calling dispatch_asynciOS - 调用 dispatch_async 时没有堆栈跟踪
【发布时间】:2013-08-22 13:00:21
【问题描述】:

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

- (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() 我在主线程上,所以没问题。至于解决方案,我会尽快回复您!
  • 你可以把你的代码包装在一个
  • 谢谢,但在尝试它时,它给了我调用块的方法,但没有告诉我行号。它只是说 0 IOSTestApp 0x0003428d __56-[DetailController tableView:cellForRowAtIndexPath:]_block_invoke + 173
  • 抱歉,这是您尝试在其周围放置 try/catch 的时候?
  • 您是否尝试过添加异常断点,如本答案所示:stackoverflow.com/questions/18336920/…

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


【解决方案1】:

你可以把你的代码包装在一个

@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
}

所有在您正在调度的块内。虽然我确信有更好的方法!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-28
    • 2011-04-23
    • 2011-11-20
    • 2011-06-16
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多