2

我的代码使用 ctl_enqueuedata 进行内核用户通信。

我注意到有时(我无法真正重现它) - 我在 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?

4

1 回答 1

1

在这条跟踪中让我感到奇怪的是套接字sodeallocctl_enqueuedata. 这不是我在正常操作中所期望的。

可能是您的套接字ctl_disconnect_func/ctl_disconnect回调被调用和调用之间存在竞争条件ctl_enqueuedata()吗?一旦您的断开回调触发,您应该确保没有新数据入队。此外,您应该确保在您从断开连接回调返回时所有入队操作都已完成。在实践中,这意味着您需要在入队时持有一个锁,并在断开连接时获取该锁,同时更改您的数据结构以取消注册连接。

如果您已经确认这绝对不是您的问题:这是什么内核版本?我很难正确协调行号。

于 2014-03-29T05:29:55.117 回答