GCDAsyncUdpSocket接收数据时抛出malloc错误

Posted

技术标签:

【中文标题】GCDAsyncUdpSocket接收数据时抛出malloc错误【英文标题】:GCDAsyncUdpSocket when receiving data throws malloc error 【发布时间】:2015-07-30 22:38:07 【问题描述】:

我正在使用 GCDAcyncUDPSocket 接收数据。在下面的代码中,我正在创建一个 (timestamp, data) 元组并将其添加到另一个数组中。这是我的代码:

- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)filterContext

dispatch_queue_t bg_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
NSString *msg = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSTimeInterval t = [self getTime];
if (msg)

    [self.activityQueue.activityQueue enqueue:@"1"];
    dispatch_async(bg_queue, ^
        NSData * d = [data copy];
            [self addRecvJitter:t withData:d];
        d= nil;
    );



- (void)addRecvJitter:(NSTimeInterval)t withData:(NSData *)data


NSString * add = [NSString  stringWithFormat:@"%f",( t - self.jitterOrigin)];
NSArray * addToList = [[NSArray alloc] initWithObjects:add,data, nil];
[_rcvdJitter addObject:addToList];

我收到以下错误 malloc:* 对象 0x7a9c2820 的错误:双释放 * 在 malloc_error_break 中设置断点调试在这一行"[_rcvdJitter addObject:addToList];"

我能得到一些帮助吗?

谢谢

【问题讨论】:

【参考方案1】:

这看起来像是线程问题。我假设在主线程上调用了 didReceiveData,并且您正在将工作分派到另一个后台线程。

您是否尝试删除d= nil;

另外,msg 正在使用接收到的数据创建,只是为了检查是否有效,然后复制数据并再次使用。

你想达到什么目的?

关于调试助手消息,您应该添加一个符号断点并将类型设置为malloc_error_break。在这里查看 Vinzzz 的答案How to “set a breakpoint in malloc_error_break to debug"

【讨论】:

以上是关于GCDAsyncUdpSocket接收数据时抛出malloc错误的主要内容,如果未能解决你的问题,请参考以下文章

GCDAsyncUdpSocket 不接收任何数据

GCDAsyncUdpSocket 和多播发送和接收

QNetworkReply 在发出完成信号时抛出 SIGSEGV

GCDAsyncUDPSocket:虽然发送成功,但没有收到任何数据

Flutter 在验证表单时抛出错误

运行服务层方法测试时抛出ResourceNotFoundException