我的代码使用ctl_enqueuedata进行内核用户通信。
我注意到SOMETIMES(我无法真正重现它) - 我在ctl_enqueuedata内部崩溃了
当我使用调试器连接时,回溯是以下
frame #0: 0xffffff80248bcecb mach_kernel`Debugger(message=<unavailable>) + 555 at model_dep.c:912
frame #1: 0xffffff802481d636 mach_kernel`panic(str=<unavailable>) + 198 at debug.c:336
frame #2: 0xffffff8024b4e45f mach_kernel`kauth_cred_unref_hashlocked(credp=0xffffff8035ca0d58) + 47 at kern_credential.c:4470
frame #3: 0xffffff8024b4cf7d mach_kernel`kauth_cred_unref(credp=<unavailable>) + 29 at kern_credential.c:4521
* frame #4: 0xffffff8024b9e585 mach_kernel`sodealloc(so=0xffffff8035ca0b80) + 21 at uipc_socket.c:710
frame #5: 0xffffff8024b59942 mach_kernel`ctl_unlock [inlined] ctl_sofreelastref + 354 at kern_control.c:263
frame #6: 0xffffff8024b598be mach_kernel`ctl_unlock(so=<unavailable>, refcount=<unavailable>, lr=<unavailable>) + 222 at kern_control.c:1076
frame #7: 0xffffff8024b58ebd mach_kernel`ctl_enqueuedata(kctlref=<unavailable>, unit=<unavailable>, data=<unavailable>, len=<unavailable>, flags=<unavailable>) + 301 at kern_control.c:549
frame #8: 0xffffff7fa6090efd
套接字凭证似乎为零。
怎么可能。是内核错误还是我滥用ctl_enqueuedata?
答案 0 :(得分:1)
在这条跟踪中让我感到奇怪的是,套接字在sodealloc
的末尾被销毁(ctl_enqueuedata
)。这不是我在正常操作中所期望的。
您的套接字调用ctl_disconnect_func
/ ctl_disconnect
回调和调用ctl_enqueuedata()
之间是否存在竞争条件?一旦断开连接回调触发,您应该确保没有新数据入队。此外,您应该确保在从断开连接回调返回时所有排队操作都已完成。实际上,这意味着您需要在排队时保持锁定并在断开连接时获取该锁定,同时更改数据结构以取消注册连接。
如果您已经确认在您的情况下肯定不是问题:这是什么内核版本?我很难正确地调整行号。