为什么在CFRunLoopRunSpecific处堆叠展开停止

时间:2014-08-28 19:11:14

标签: ios macos stack crash-reports

例如:在调用堆栈下面

在CFRunLoopRunSpecific调用堆栈展开停止,为什么它不会在main,甚至为空之前展开?

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libsystem_kernel.dylib          0x36398848 __kill + 8
1   FrogFinder                      0x000b5034 0x69000 + 311348
2   CoreFoundation                  0x3447e980 __handleUncaughtException + 68
3   libobjc.A.dylib                 0x346ce2ca _objc_terminate + 122
4   libc++abi.dylib                 0x338a33be _ZL19safe_handler_callerPFvvE + 70
5   libc++abi.dylib                 0x338a344a std::terminate() + 14
6   libc++abi.dylib                 0x338a481e __cxa_rethrow + 82
7   libobjc.A.dylib                 0x346ce22e objc_exception_rethrow + 6
8   CoreFoundation                  0x343d453e CFRunLoopRunSpecific + 398
9   CoreFoundation                  0x343d439e CFRunLoopRunInMode + 98
10  GraphicsServices                0x30c58fc6 GSEventRunModal + 150
11  UIKit                           0x3785573c UIApplicationMain + 1084
12  FrogFinder                      0x0006a7e6 0x69000 + 6118
13  FrogFinder                      0x0006a7a4 0x69000 + 6052

2 个答案:

答案 0 :(得分:3)

但是你在这里复制的回溯确实一直都是主要的。你的问题到底是什么?如果你的问题是:“为什么异常不会一直到主?”然后答案是CFRunLoop安装了一个包罗万象的处理程序。我相信Objective-C和C ++例外。

答案 1 :(得分:1)

@try/@catch/@finally块中,在@finally结束时重新抛出异常。这通常适用于Objective-C异常,因为它们将原始故障点捕获为内部状态。 C ++异常没有(因为可以抛出任何类型)。所以在这里,您正在使用@finally内部CFRunLoopRunSpecific内部代码来维护堆栈展开不变量,同时也不幸地丢失了原始上下文。

您可以通过观察在运行循环源或NSExceptions中提升常规CFRunLoopPerformBlock与C ++异常的行为来自行探索差异。