1 对主线程Runloop注册一个回调函数runLoopObserverCallBack。在每次runloop的CFRunLoopActivity改变时回调。
2 开一个子线程。里面使用while循环不断dispatch_semaphore_wait等待主线程进入下一个CFRunLoopActivity时唤醒。(进入一个CFRunLoopActivity会调用dispatch_semaphore_signal)。
3 要是dispatch_semaphore_wait在50ms内没被唤醒。并且当前状态是kCFRunLoopBeforeSources或者kCFRunLoopAfterWaiting则认为是卡顿。卡顿次数加1。进入下一次循环。
4 当卡顿次数大于等于5次后,则使用PLCrashReporter打印当前堆栈信息。