最近,我在 10.14 上测试了我的 kext,它似乎运行了一段时间。但是经过一些随机时间(可能需要几分钟),它会产生以下恐慌:
thread_invoke: preemption_level -1, possible cause: unlocking an
unlocked mutex or spinlock"
我已经多次运行了我的代码,并注意到恐慌可能是由我的用户空间守护进程在调用sys 调用时触发的,或者在调用函数psynch_cvwait
后触发上下文切换时直接从内核扩展触发。msleep
这是来自内核的跟踪:
frame #4: 0xffffff800afe24a3 kernel`panic(str=<unavailable>) at debug.c:620 [opt]
frame #5: 0xffffff800affef06 kernel`thread_invoke(self=0xffffff801b7a4030, thread=0xffffff801afe4540, reason=0) at sched_prim.c:2261 [opt]
frame #6: 0xffffff800affdaff kernel`thread_block_reason(continuation=<unavailable>, parameter=<unavailable>, reason=<unavailable>) at sched_prim.c:3088 [opt]
frame #7: 0xffffff800b4fcfe1 kernel`_sleep [inlined] thread_block(continuation=<unavailable>) at sched_prim.c:3104 [opt]
frame #8: 0xffffff800b4fcfd6 kernel`_sleep(chan=<unavailable>, pri=0, wmsg=<unavailable>, abstime=1299691844730, continuation=0x0000000000000000, mtx=0x0000000000000000) at kern_synch.c:251 [opt]
frame #9: 0xffffff800b4fd352 kernel`msleep(chan=0x01000004001ddd89, mtx=0x0000000000000000, pri=0, wmsg="", ts=<unavailable>) at kern_synch.c:346 [opt]
接下来是从用户空间守护进程 sys 调用触发的堆栈跟踪:
frame #4: 0xffffff800afe24a3 kernel`panic(str=<unavailable>) at debug.c:620 [opt]
frame #5: 0xffffff800affef06 kernel`thread_invoke(self=0xffffff80176f5a50, thread=0xffffff8019a5de60, reason=0) at sched_prim.c:2261 [opt]
frame #6: 0xffffff800affdaff kernel`thread_block_reason(continuation=<unavailable>, parameter=<unavailable>, reason=<unavailable>) at sched_prim.c:3088 [opt]
frame #7: 0xffffff7f8cbf5080
frame #8: 0xffffff7f8cbf6dcf
frame #9: 0xffffff800b499c3c kernel`psynch_cvwait(p=<unavailable>, uap=<unavailable>, retval=<unavailable>) at pthread_shims.c:397 [opt]
丢失的帧属于扩展com.apple.kec.pthread(1.0)[C69B97C1-505D-3629-9D64-7B7BC6D780A8]@0xffffff7f8cbf3000->0xffffff7f8cbfafff
起初我以为这可能是随机内存损坏引起的,但看起来在我所有的复制之后,除了我刚才提到的 2 之外,没有其他实体引发了恐慌。
如果我查看恐慌消息,它会连接到每个处理器的 %gs 寄存器中可能找到的值,其中保留了抢占级别。但是,在 lldb 中,我无法访问此寄存器,我怀疑它是否映射到我的驱动程序内存。
所以我剩下的就是对我的驱动程序的部分进行评论,看看问题是否仍然存在。也许你们中的任何人对如何解决这个问题有更多的见解?
谢谢