Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos RetrieveINQUIRYData()中偶尔出现OSX内核死机_Macos_Driver_Kernel Extension_Scsi - Fatal编程技术网

Macos RetrieveINQUIRYData()中偶尔出现OSX内核死机

Macos RetrieveINQUIRYData()中偶尔出现OSX内核死机,macos,driver,kernel-extension,scsi,Macos,Driver,Kernel Extension,Scsi,我有一个SCSI驱动程序,它在启动过程中调用IOSCSIPrimaryCommandsDevice::RetrieveINQUIRYData()。有时,在测试过程中拔出、弹出、重新插入和滥用设备后,会出现内核死机 此功能的主要功能是: bool RetrieveINQUIRYData ( UInt8 EVPD, UInt8 inquiryPage, UInt8 * inquiryBuffer, UInt16 * dataSize); 调用这个的例程是这样开始的。

我有一个SCSI驱动程序,它在启动过程中调用
IOSCSIPrimaryCommandsDevice::RetrieveINQUIRYData()
。有时,在测试过程中拔出、弹出、重新插入和滥用设备后,会出现内核死机

此功能的主要功能是:

bool RetrieveINQUIRYData (
    UInt8 EVPD,
    UInt8 inquiryPage,
    UInt8 * inquiryBuffer,
    UInt16 * dataSize);
调用这个的例程是这样开始的。它是根据来自的PublishUnitSerialNumber建模的

这在大多数情况下都有效,只是偶尔会出现恐慌。GDB回溯没有任何帮助,因为该函数中没有符号,所以我只知道它是在另一个函数调用之后。我也找不到这个函数的源代码-我认为它是封闭源代码IOKit代码的一部分

#0  Debugger (message=0x8001003b <Address 0x8001003b out of bounds>) at /SourceCache/xnu/xnu-1504.15.3/osfmk/i386/AT386/model_dep.c:867
#1  0xffffff8000204d15 in panic (str=0xffffff800057ecb8 "Kernel trap at 0x%016llx, type %d=%s, registers:\nCR0: 0x%016llx, CR2: 0x%016llx, CR3: 0x%016llx, CR4: 0x%016llx\nRAX: 0x%016llx, RBX: 0x%016llx, RCX: 0x%016llx, RDX: 0x%016llx\nRSP: 0x%016llx, RBP: 0x%0"...) at /SourceCache/xnu/xnu-1504.15.3/osfmk/kern/debug.c:303
#2  0xffffff80002d1208 in panic_trap [inlined] () at :1100
#3  0xffffff80002d1208 in kernel_trap (state=<value temporarily unavailable, due to optimizations>) at /SourceCache/xnu/xnu-1504.15.3/osfmk/i386/trap.c:1001
#4  0xffffff80002e3f4a in trap_from_kernel () at pmap.h:215
#5  0xffffff7f808040b6 in ?? ()
#6  0xffffff7f80804b8b in ?? ()
#7  0xffffff7f80f1324c in com_company_driver_myDriver::PublishUnitSerialNumber (this=0xffffff80130e0600, object=0xffffff8015375000) at /Volumes/user/src/driver/MyDriver.cpp:106
#8  0xffffff7f80f13553 in com_company_driver_myDriver::start (this=0xffffff80130e0600, provider=0xffffff8015375000) at /Volumes/user/src/driver/MyDriver.cpp:53
#9  0xffffff800052d5a6 in IOService::startCandidate (this=0x2710, service=0xe) at /SourceCache/xnu/xnu-1504.15.3/iokit/Kernel/IOService.cpp:2879
#10 0xffffff800052dcb1 in IOService::probeCandidates (this=0xffffff8015375000, matches=<value temporarily unavailable, due to optimizations>) at /SourceCache/xnu/xnu-1504.15.3/iokit/Kernel/IOService.cpp:2798
...
...
#0调试器(消息=0x8001003b)位于/SourceCache/xnu/xnu-1504.15.3/osfmk/i386/AT386/model_dep.c:867
#1 0xFFFF8000204D15处于死机状态(str=0xffffff800057ecb8“0x%016llx处的内核陷阱,类型%d=%s,寄存器:\nCR0:0x%016llx,CR2:0x%016llx,CR3:0x%016llx,CR4:0x%016llx\nRAX:0x%016llx,RBX:0x%016llx,RCX:0x%016llx,RDX:0x%016llx\nRSP:0x%016llx,RBP:0x%0“…)在/SourceCache/nu/nu-1504.15/fmosc
#位于1100处的2 0xFFFF80002D1208处于紧急_陷阱[内联]()
#3 0xFFFF80002D1208位于/SourceCache/xnu/xnu-1504.15.3/osfmk/i386/trap.c:1001的内核_陷阱(状态=)中
#在pmap.h:215处的_内核()中的陷阱_中有4 0xffffff80002e3f4a
#5 0xFFFF7F808040B6英寸??()
#6 0xFFFF7F80804B8B英寸??()
#7 0xFFFF7F80F1324C位于/Volumes/user/src/driver/myDriver::PublishUnitSerialNumber(this=0xFFFF80130E0600,object=0xffffff8015375000)处的/Volumes/user/src/driver/myDriver.cpp:106
#在com_company_driver_myDriver::start(this=0xffffff80130e0600,provider=0xffffff8015375000)at/Volumes/user/src/driver/myDriver.cpp:53
#9/SourceCache/xnu/xnu-1504.15.3/iokit/Kernel/IOService.cpp:2879处的IOService::startCandidate(this=0x2710,service=0xe)中的0xffffff800052d5a6
#在/SourceCache/xnu/xnu-1504.15.3/iokit/Kernel/IOService.cpp:2798处,IOService::probeCandidates(this=0xffffffff8015375000,matches=)中的10 0xffffff800052dcb1
...
...

在调用
RetrieveINQUIRYData()
之前,我是否应该检查或执行一些在上述代码中没有执行的操作?从我看到的情况来看,所有指针都被检查为NULL,长度被设置为常量,唯一的其他参数是EVPD的文本。

我不熟悉SCSI堆栈,但这里有一些想法:

  • 即使是封闭源代码的kexts也有基本的调试符号。因此,如果您
    /System/Library/Extensions/
    添加kext
    相关的kext,您至少应该获得函数/方法名(以及签名,如果是C++)。当然,您不会得到行号,但会得到函数反汇编边界等

  • 恐慌信息很有趣:

  • #0调试器(消息=0x8001003b)位于/SourceCache/xnu/xnu-1504.15.3/osfmk/i386/AT386/model_dep.c:867

    在10.6.8源代码中,我找不到该消息来自何处,因此我不太确定预期的界限以及该需求来自何处。它看起来可能是一个物理地址-您是否可以插入一些
    kprintf
    debug输出来转储缓冲区的
    getPhysicalSegment(0,NULL,0)
    结果,看看它是否与触发KP的地址匹配?如果不是这样,请查看是否可以找出导致崩溃的指令以及错误地址的来源

    祝你好运

    #0  Debugger (message=0x8001003b <Address 0x8001003b out of bounds>) at /SourceCache/xnu/xnu-1504.15.3/osfmk/i386/AT386/model_dep.c:867
    #1  0xffffff8000204d15 in panic (str=0xffffff800057ecb8 "Kernel trap at 0x%016llx, type %d=%s, registers:\nCR0: 0x%016llx, CR2: 0x%016llx, CR3: 0x%016llx, CR4: 0x%016llx\nRAX: 0x%016llx, RBX: 0x%016llx, RCX: 0x%016llx, RDX: 0x%016llx\nRSP: 0x%016llx, RBP: 0x%0"...) at /SourceCache/xnu/xnu-1504.15.3/osfmk/kern/debug.c:303
    #2  0xffffff80002d1208 in panic_trap [inlined] () at :1100
    #3  0xffffff80002d1208 in kernel_trap (state=<value temporarily unavailable, due to optimizations>) at /SourceCache/xnu/xnu-1504.15.3/osfmk/i386/trap.c:1001
    #4  0xffffff80002e3f4a in trap_from_kernel () at pmap.h:215
    #5  0xffffff7f808040b6 in ?? ()
    #6  0xffffff7f80804b8b in ?? ()
    #7  0xffffff7f80f1324c in com_company_driver_myDriver::PublishUnitSerialNumber (this=0xffffff80130e0600, object=0xffffff8015375000) at /Volumes/user/src/driver/MyDriver.cpp:106
    #8  0xffffff7f80f13553 in com_company_driver_myDriver::start (this=0xffffff80130e0600, provider=0xffffff8015375000) at /Volumes/user/src/driver/MyDriver.cpp:53
    #9  0xffffff800052d5a6 in IOService::startCandidate (this=0x2710, service=0xe) at /SourceCache/xnu/xnu-1504.15.3/iokit/Kernel/IOService.cpp:2879
    #10 0xffffff800052dcb1 in IOService::probeCandidates (this=0xffffff8015375000, matches=<value temporarily unavailable, due to optimizations>) at /SourceCache/xnu/xnu-1504.15.3/iokit/Kernel/IOService.cpp:2798
    ...
    ...