내 코드는 커널 사용자 통신에 ctl_enqueuedata를 사용하고 있습니다.Ost 커널 크래시 (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
을 다음 소켓 자격 증명이 0입니다.
어떻게 될 수 있습니다. 커널 버그입니까, 아니면 ctl_enqueuedata를 오용합니까?
예! 또한 클라이언트가 연결을 끊고 커널이 그 시점에 ctl_enqueuedata를 사용하여 데이터를 보내고 있다고 생각합니다. 하지만 ctl_disconnect_func에서 lck_rw_lock_exclusive (dlist.read_write_lock)를 사용하고 ctl_enqueuedata 전에 lck_shared_lock을 사용하여 잠금을 만들려고했습니다. –
정말 작동하는지 모르겠지만 https://developer.apple.com/library/mac/documentation/Kernel/Reference/kern_control_header_reference/Reference/reference.html 도움이 "ctl_disconnect_func는 수신하는 데 사용됩니다. 클라이언트가 커널 컨트롤에서 연결이 끊겼다는 알림. " 이것이 맞다면 잠금이 도움이되지 않습니다 - 클라이언트는 이미 연결이 끊어져 있습니다. 우리는 방금 그것에 대해 통지를 받았습니다 –
또한, 사용자 공간 프로세스가 방금 충돌했을 때 어떻게 될 것입니까? (그것은 나의 경우에도 가능하다). 이 경우 ctl_disconnect_func에 어떤 종류의 잠금이 있어도 사용자 공간이 존재하지 않습니다 –