0

好的,我看了几个小时。如果我提供的数据没有提供完整的上下文,请告诉我,我会提供更多。

所以基本上我得到了一个由 NSData * packetDescData 指向的数据,它看起来像这样:

00000000 00000000 00000007 00000007 00000000 00000016 0000001d 00000000 0000001a 00000037 00000000
0000002a 00000061 00000000 00000025 00000086 00000000 00000029 000000af 00000000 00000032 000000e1     
00000000 00000027 00000108 00000000 00000038 00000140 00000000 00000031 00000171 00000000 0000001e
0000018f 00000000 00000035 000001c4 00000000 00000027 000001eb 00000000 0000002d 00000218 00000000 
00000031 00000249 00000000 00000026 0000026f 00000000 00000033 000002a2 00000000 00000037 000002d9 
00000000 00000035 0000030e 00000000 0000002c 0000033a 00000000 00000025 0000035f 00000000 00000020 
0000037f 00000000 00000034 000003b3 00000000 0000005d

我运行了一个循环,该循环从某些偏移量读取数据并将它们分配给不同的变量:(以及日志语句):

for (int i=0; i < packetDescNumber; i++) {    
    packetDescs[i].mStartOffset = [packetDescData rw_int32AtOffset:offset];
    offset += sizeof(UInt32);        
    NSLog(@"packetDescriptionArray[%d].mStartOffset: %lld, fillbuffindex: %d, offset %lu", i,packetDescs[i].mStartOffset, fillBufferIndex, offset);


    packetDescs[i].mVariableFramesInPacket = [packetDescData rw_int32AtOffset:offset];
    offset += sizeof(UInt32);
    NSLog(@"packetDescriptionArray[%d].mVariableFramesInPacket: %lu, fillbuffindex: %d, offset %lu", i,packetDescs[i].mVariableFramesInPacket, fillBufferIndex, offset);


    packetDescs[i].mDataByteSize = [packetDescData rw_int32AtOffset:offset];                
    offset += sizeof(UInt32);
    NSLog(@"packetDescriptionArray[%d].mDataByteSize: %lu, fillbuffindex: %d, offset %lu", i,packetDescs[i].mDataByteSize, fillBufferIndex, offset);

    NSLog(@"-------------------------------------------------------\n\n\n\n");

}    

rw_int32AtOffset 定义为:

- (int)rw_int32AtOffset:(size_t)offset
{
    const int *intBytes = (const int *)[self bytes];
    return ntohl(intBytes[offset / 4]);
}

输出是这样的(注意一些其他随机变量(fillbuffindex)..在同一个线程上..当mStartOffset在packetDescriptionArray [6].mStartOffset处变为175时,它的值突然变为与mStartOffset相同的值:

packetDescriptionArray[4].mStartOffset: 97, fillbuffindex: 0, offset 52
MAIN: we are appending 1231 bytes to ring buffer
MAIN: appendToRingBuffer: FILLBUFFERINDEX: 0
packetDescriptionArray[4].mVariableFramesInPacket: 0, fillbuffindex: 0, offset 56
packetDescriptionArray[4].mDataByteSize: 37, fillbuffindex: 0, offset 60
-------------------------------------------------------



packetDescriptionArray[5].mStartOffset: 134, fillbuffindex: 0, offset 64
packetDescriptionArray[5].mVariableFramesInPacket: 0, fillbuffindex: 0, offset 68
packetDescriptionArray[5].mDataByteSize: 41, fillbuffindex: 0, offset 72
-------------------------------------------------------



packetDescriptionArray[6].mStartOffset: 175, fillbuffindex: 175, offset 76
packetDescriptionArray[6].mVariableFramesInPacket: 0, fillbuffindex: 175, offset 80
packetDescriptionArray[6].mDataByteSize: 50, fillbuffindex: 175, offset 84
-------------------------------------------------------



packetDescriptionArray[7].mStartOffset: 225, fillbuffindex: 175, offset 88
packetDescriptionArray[7].mVariableFramesInPacket: 0, fillbuffindex: 175, offset 92
packetDescriptionArray[7].mDataByteSize: 39, fillbuffindex: 175, offset 96
-------------------------------------------------------



MAIN: we are appending 1224 bytes to ring buffer
MAIN: appendToRingBuffer: FILLBUFFERINDEX: 175
packetDescriptionArray[8].mStartOffset: 264, fillbuffindex: 175, offset 100
packetDescriptionArray[8].mVariableFramesInPacket: 0, fillbuffindex: 175, offset 104
packetDescriptionArray[8].mDataByteSize: 56, fillbuffindex: 175, offset 108
-------------------------------------------------------

关键是我在 MAIN: we are appending 1231 bytes to ring buffer一个单独的线程上附加到一个环形缓冲区..环形缓冲区在线程之间共享,但它与fillbuffindex无关..有什么想法吗?

4

1 回答 1

0

我最初在评论中回答:

我的工作假设是如果内存边界超出(即使在阅读期间),那么几乎任何事情都可能发生。所以阅读你的帖子我假设你在某个地方超出了你的记忆界限。valgrind --leak-check=yes a.out使用诸如 valgrind 之类的内存调试器以及诸如 clang 静态分析器之类的静态分析器来查找与内存相关的错误:scan-build gcc mycode.c

这是对任何问题的通用答案,例如:“我在使用动态内存分配的代码中出现了非常奇怪的行为。” 关键是内存溢出会导致未定义的行为,包括例如变量在没有明确分配的情况下发生变化。

除了手动调试之外,像 clang 静态分析器这样的静态分析器和像 valgrind 这样的内存调试器也非常适合发现这样的错误。

于 2012-09-28T12:00:32.147 回答