我需要编写简单的看门狗,它可以检测iOS中的死锁。 我已经使用GCD调度源作为计时器实现了简单的计数器,该计时器递增计数器(在主线程上调度)。
这对于检测主线程是否卡住非常有用,但我希望通过能够检测任何线程上的死锁来改进它。
我的想法是在所有线程中定期循环并比较检查之间的线程回溯,但我不确定这是好方法:
伪码:
const task_t this_task = mach_task_self();
const thread_t this_thread = mach_thread_self();
kern_return_t kr;
thread_act_array_t threads;
mach_msg_type_number_t thread_count;
kr = task_threads(this_task, &threads, &thread_count);
for (mach_msg_type_number_t i = 0; i < thread_count; i++) {
// 0. get thread:
thread_t thread = threads[i];
// 1. do not analyze this thread (it is an watchdog thread):
if (this_thread == thread)continue;
// 2. suspend thread for a moment:
if((kr = thread_suspend(thread)) != KERN_SUCCESS)continue;
// 3. get backtrace:
int backtraceLength = ksbt_backtraceThread(thread, (uintptr_t*)backtrace, sizeof(backtrace));
// 4. todo - compare.... (HOW TO???)
任何人都可以提供帮助,如果比较回溯是检测线程是否卡住的好方法还是有更好的POSIX方法?