我有以下代码:
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中有一个错误。
答案 0 :(得分:0)
一些想法。首先,IOKit的生命周期对我而言一直很棘手。在许多方面,必须非常小心地保留对象,这些对象被API调用“消耗”了。
第二,您的崩溃发生在device_removed_callback中,这进一步使我怀疑某些对象已被释放到幕后,但是直到回调发生时您才注意到。
错误的指针并不总是为空,并且经常指向映射到您的进程中的内存,但没有指向您认为应该的内容。这通常称为悬空指针,并且非常非常常见。通常也很难调试。
我敢打赌,这是由于IOKit代码另一个区域中的对象生命周期问题所致,并在此处体现。尝试使用NSZombies(我可能还记得,它也可能适用于CF对象)。另外,再次检查正在注册设备通知的区域在内存管理中做的正确。我在该区域遇到了许多错误。