我写了一个线程挂起检测器,当某个线程意外挂起时会打印一些调试输出(回溯等)。每个想要被监视的线程在挂起检测器系统中注册自己,指定一些超时(在我的情况下为5秒)并经常调用一些IAmAlife()
函数(在我的情况下大约每1-10ms)。
效果很好。但是,在某些情况下,我会得到误报。例如,当我SIGSTOP
进程并稍后恢复它时,它会被触发(例如,当附加一个像GDB / LLDB这样的调试器时)。而且很少,当这个过程没有做太多时,只是空转,我猜MacOSX的App Nap会启动,它也会触发挂起探测器。
我怎么能检测到这样的系统挂起?查看处理器时间(clock()
)并没有多大帮助,因为如果我的应用处于死锁状态,它可能也不会消耗太多(如果有的话)处理器时间。
答案 0 :(得分:0)
因此,实现可能有点复杂,但基本思路很简单:跟踪挂钟时间并使用它来计算“宽限期”,将其添加到每个线程可以延迟的时间量给家里打电话。
使用类似gettimeofday()
(http://linux.die.net/man/2/gettimeofday)的内容来记录观察者线程首次启动的时间。每次重新唤醒时,再次呼叫gettimeofday()
,取差异,然后从中减去经过的“处理器时间”。这为您提供了应该授予的粗略“宽限期”,因为您的流程没有运行的时间。
唯一的微小复杂化是因为需要为您正在观看的每个线程单独维护宽限期。既然你清楚地知道写线程,我会假设这部分完全符合你的能力: - )。