几次成功写入后Qt QSharedMemory分段错误

时间:2013-03-19 20:51:08

标签: qt shared-memory qtembedded

我使用QSharedMemory存储一些数据,并希望随后将数据附加到其中包含的数据。所以我用新数据多次调用以下代码。 " audioBuffer"是给这个函数的新数据。在memcpy操作中出现故障之前,我可以将此函数调用大约4-7次(并且它会有所不同)。 QSharedMemory位置的大小很大,因此在我发生之前的几次调用中,没有memcpy复制数据超出其边界的问题。此外,m_SharedAudioBuffer.errorString()在memcpy操作之前没有任何错误。目前,我只有一个使用此QSharedMemory段的进程。我还尝试连续编写,而不是每次都附加,并且工作正常,所以当我尝试将更多数据附加到共享内存段时会发生一些事情。有任何想法吗?谢谢!

    // Get the buffer size for the current audio buffer in shared memory
    int bufferAudioDataSizeBytes = readFromSharedAudioBufferSizeMemory(); // This in number of bytes

    // Create a bytearray with our data currently in the shared buffer
    char* bufferAudioData = readFromSharedAudioBufferMemory();
    QByteArray currentAudioStream = QByteArray::fromRawData(bufferAudioData,bufferAudioDataSizeBytes);
    QByteArray currentAudioStreamDeepCopy(currentAudioStream);

    currentAudioStreamDeepCopy.append(audioBuffer);
    dataSize = currentAudioStreamDeepCopy.size();

    //#if DEBUG
    qDebug() << "Inserting audio buffer, new size is: " << dataSize;
    //#endif

    writeToSharedAudioBufferSizeMemory( dataSize ); // Just the size of what we received

    // Write into the shared memory
    m_SharedAudioBuffer.lock();

    // Clear the buffer and define the copy locations
    memset(m_SharedAudioBuffer.data(), '\0', m_SharedAudioBuffer.size());
    char *to = (char*)m_SharedAudioBuffer.data();
    char *from = (char*)audioBuffer.data();

    // Now perform the actual copy operation to store the buffer
    memcpy( to, from, dataSize );

    // Release the lock
    m_SharedAudioBuffer.unlock();

编辑:也许,这是由于我的目标嵌入式设备非常小。当我尝试写入共享内存时,可用的RAM很大,但是我注意到在/ tmp目录中(仅给出了4Mb)我有以下条目 - 大小在/ tmp中几乎不消耗,所以我&# 39;我不知道为什么我不能分配更多的内存,QSharedMemory :: create方法永远不会因我的最大大小960000而失败:

# cd /tmp/
# ls
QtSettings
lib
qipc_sharedmemory_AudioBufferData2a7d5f1a29e3d27dac65b4f350d76a0dfd442222
qipc_sharedmemory_AudioBufferSizeData6b7acc119f94322a6794cbca37ed63df07b733ab
qipc_systemsem_AudioBufferData2a7d5f1a29e3d27dac65b4f350d76a0dfd442222
qipc_systemsem_AudioBufferSizeData6b7acc119f94322a6794cbca37ed63df07b733ab
qtembedded-0
run

1 个答案:

答案 0 :(得分:0)

问题似乎是我在共享内存段返回的指针上使用QByteArray的:: fromRawData。当我在这个指针上使用memcpy显式复制数据,然后使用复制的数据构造我的QByteArray时,seg故障就停止了。