【问题标题】:EXC_BREAKPOINT crash in CFReadStreamReadCFReadStreamRead 中的 EXC_BREAKPOINT 崩溃
【发布时间】:2016-05-21 02:55:03
【问题描述】:

有人知道为什么这个有时会崩溃吗?我被这个难住了。我猜它会在 100 次或类似情况下崩溃 1 次。

// from header file
struct _PTP_IP_Packet_INIT_EVENT_ACK {
    uint32_t ptpIPPacketLength;
    uint32_t ptpIPType;
};
typedef struct _PTP_IP_Packet_INIT_EVENT_ACK      PTP_IP_Packet_INIT_EVENT_ACK;
#define PTP_IP_PacketLength_INIT_EVENT_ACK        (2*sizeof(uint32_t))

崩溃在最后一行:

    PTP_IP_Packet_INIT_EVENT_ACK eventack;
    PTP_CNT_INIT(eventack);
    len = [self.myWorker.eventInputStream read:(unsigned char*)&eventack maxLength:PTP_IP_PacketLength_INIT_EVENT_ACK];

崩溃数据:

#24
EXC_BREAKPOINT 0x0000000184045750
Crashed: PTPWork-192.168.1.1
0  CoreFoundation                 0x184045750 CFHash + 256
1  CoreFoundation                 0x184046c1c CFBasicHashGetCountOfKey + 960
2  CoreFoundation                 0x184046810 CFSetContainsValue + 152
3  CoreFoundation                 0x18407644c CFRunLoopRemoveSource + 236
4  CFNetwork                      0x183b68fcc SocketStream::read(__CFReadStream*, unsigned char*, long, CFStreamError*, unsigned char*) + 520
5  CoreFoundation                 0x184072c88 CFReadStreamRead + 520
6  Photobooth                     0x1001348a0 -[PTPCamera initializeEventStreams] (PTPCamera.m:188)
7  Photobooth                     0x100134398 -[PTPCamera initializePTP] (PTPCamera.m:127)
8  Photobooth                     0x1001084b0 -[PTPWorker setState:] (PTPWorker.m:333)
9  Photobooth                     0x100107b8c -[PTPWorker main] (PTPWorker.m:222)
10 Foundation                     0x18505e308 __NSThread__main__ + 1072
11 libsystem_pthread.dylib        0x195babdc8 _pthread_body + 164
12 libsystem_pthread.dylib        0x195babd24 _pthread_body + 158
13 libsystem_pthread.dylib        0x195ba8ef8 thread_start + 4

【问题讨论】:

    标签: ios cocoa-touch crash


    【解决方案1】:

    这种上下文中的 EXC_BREAKPOINT 通常意味着抛出了 NSException,这是调试器中断的一个方便的地方。

    self.myWorker.eventInputStream 出错的两个最可能的原因(不相互排斥)是

    • 您正在尝试在其源关闭后从中读取
    • 该来源存在线程争用问题

    这在 NSThread 中崩溃使得第二个选项成为可能。如果您报告“100 次中有 1 次或类似情况”发生这种情况,则第二个选项几乎可以确定。

    为了确定,将使用 self.myWorker.eventInputStream 的所有内容放在主线程上。如果崩溃立即完全消失,正如预期的那样,那么您需要弄清楚如何正确锁定对流的访问,以便这里的争用问题消失。祝你好运!

    【讨论】:

    • 谢谢!更多信息:线程没有运行循环 - 有问题的 nsstream 正在使用主线程的运行循环。我更详细地发现了错误:CFReadStreamRead 用 NULL 调用了 CFHash。即使nsstream被声明为原子,我是否不允许多个线程读取nsstream?
    • 嗯。在与套接字的 runloop 不同的线程上阅读对我来说听起来肯定会出现问题。您是否在某处找到了一些明确声明它是安全的文档?
    • 没有。但我已经做了很多年了。我比较确定这个问题不是由那个直接引起的
    猜你喜欢
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    相关资源
    最近更新 更多