CFReadStreamRead中的EXC_BREAKPOINT崩溃

3

有人知道为什么这个有时候会崩溃吗?我对这个问题感到困惑。我猜它崩溃的概率大约是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
1个回答

4

在这种情况下,EXC_BREAKPOINT通常意味着抛出了NSException异常,这是调试器断点的便利位置。

导致self.myWorker.eventInputStream出现问题的两个可能原因(不相互排斥)是:

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

由于这会在NSThread中崩溃,因此第二个选项很有可能。 您报告这种情况发生“每100次左右一次”,这使第二个选项几乎可以肯定。

为确保,请将使用self.myWorker.eventInputStream的所有内容放在主线程中。 如果崩溃立即完全消失,则需要找出如何正确锁定对流的访问,以使此处的任何争用问题消失。 祝你好运!


谢谢!更多信息:该线程没有运行循环——所涉及的NSStream正在使用主线程的运行循环。我发现了更详细的错误:CFReadStreamRead通过NULL调用CFHash。即使NSStream声明为原子,我是否不能使用多个线程读取NSStream? - xaphod
嗯,对我来说,在不同的线程上读取与套接字运行循环不同的东西似乎是有可能出现问题的。你是否找到了一些明确说明它是安全的文档? - Alex Curylo
不是的。但我已经做了好几年了。我相对确定这个问题不是由此直接引起的。 - xaphod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接