【问题标题】:macos - CFStringGetLength EXC_BAD_ACCESS (SIGSEGV) crashmacos - CFStringGetLength EXC_BAD_ACCESS (SIGSEGV) 崩溃
【发布时间】:2015-03-28 12:23:09
【问题描述】:

我有以下代码:

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

我该如何解决这个问题?在调用CFStringGetLength 之前,我正在检查 str 是否为 NULL,显然这还不够。

编辑:

我仍然遇到这种崩溃,总是在同一个地方。

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

还有其他方法可以获取CFStringRef 的长度吗?

我怀疑api有bug。

【问题讨论】:

    标签: macos core-foundation


    【解决方案1】:

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

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

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

    我敢打赌,这是由于您的 IOKit 代码的另一个区域中的对象生命周期问题,并在此处体现。尝试使用 NSZombies(它可能也适用于 CF 对象,我不记得了)。此外,请仔细检查正在注册设备通知的区域是否正在使用内存管理进行正确的操作。我在这方面遇到了很多错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      • 2013-03-24
      • 2010-11-18
      • 2013-01-07
      • 1970-01-01
      相关资源
      最近更新 更多