macos - CFStringGetLength EXC_BAD_ACCESS(SIGSEGV)崩溃

时间:2015-01-29 10:10:14

标签: macos core-foundation

我有以下代码:

char *get_string_property_2(IOHIDDeviceRef device, CFStringRef prop)
{

    CFStringRef str = IOHIDDeviceGetProperty(device, prop);

    if(str)
    {
         CFIndex str_len = CFStringGetLength(str);
         ...

    }

    ...
}

有时(并非总是)我在CFStringGetLength中遇到以下日志崩溃:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00007fff770083a8

Thread 8 Crashed:
0   libobjc.A.dylib                 0x00007fff88e22097 objc_msgSend + 23
1   libtobii_usb.dylib              0x00000001081c4f72 get_string_property_2 + 130 (macosx.c:99)
2   serviced                        0x00000001081a5fad device_removed_callback + 285 (daemond_mac.c:614)
3   libsystem_pthread.dylib         0x00007fff8ae35899 _pthread_body + 138
4   libsystem_pthread.dylib         0x00007fff8ae3572a _pthread_start + 137
5   libsystem_pthread.dylib         0x00007fff8ae39fc9 thread_start + 13

我该如何解决这个问题?

1}我在调用CFStringGetLength之前检查str是否为NULL,显然这还不够。

修改

我仍然在同一个地方遇到这次崩溃。

如果它是一个坏指针,为什么不会在IOHIDDeviceGetProperty上面的一行崩溃?

有没有其他方法可以获得CFStringRef的长度?

我怀疑api中有一个错误。

1 个答案:

答案 0 :(得分:0)

一些想法。首先,IOKit的生命周期对我而言一直很棘手。在许多方面,必须非常小心地保留对象,这些对象被API调用“消耗”了。

第二,您的崩溃发生在device_removed_callback中,这进一步使我怀疑某些对象已被释放到幕后,但是直到回调发生时您才注意到。

错误的指针并不总是为空,并且经常指向映射到您的进程中的内存,但没有指向您认为应该的内容。这通常称为悬空指针,并且非常非常常见。通常也很难调试。

我敢打赌,这是由于IOKit代码另一个区域中的对象生命周期问题所致,并在此处体现。尝试使用NSZombies(我可能还记得,它也可能适用于CF对象)。另外,再次检查正在注册设备通知的区域在内存管理中做的正确。我在该区域遇到了许多错误。