2013-03-19 2 views
0

J'utilise QSharedMemory pour stocker des données et je souhaite ajouter ultérieurement des données à ce qui y est contenu. J'appelle donc le code suivant plusieurs fois avec de nouvelles données. Le "AudioBuffer" est une nouvelle donnée donnée à cette fonction. Je peux appeler cette fonction environ 4-7 fois (et cela varie) avant de voir les erreurs sur l'opération memcpy. La taille de l'emplacement QSharedMemory est énorme, donc dans les quelques appels que je fais avant de segmenter les failles, il n'y a pas de problème de copie de données memcpy au-delà de ses limites. De plus, m_SharedAudioBuffer.errorString() ne donne aucune erreur jusqu'à l'opération memcpy. Actuellement, je n'ai qu'un seul processus utilisant ce segment QSharedMemory. J'ai également essayé d'écrire continuellement sans ajout à chaque fois et cela fonctionne bien, donc quelque chose se passe lorsque j'essaie d'ajouter plus de données au segment de mémoire partagée. Des idées? Merci!Qt QSharedMemory Défauts de segmentation après plusieurs écritures réussies

// 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(); 

EDIT: Peut-être, cela est dû à mon périphérique embarqué cible qui est très petit. La RAM disponible est grande quand j'essaye d'écrire dans la mémoire partagée, mais je remarque que dans le répertoire/tmp (qui n'a que 4 Mo) j'ai les entrées suivantes - la taille n'est pas presque consommée dans/tmp bien que je sois m ne sais pas pourquoi je ne pouvais pas allouer plus de mémoire, aussi la méthode QSharedMemory :: create ne manque jamais de ma taille maximum de 960000:

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

Répondre

0

le problème semble être que j'utilisais :: fromRawData de QByteArray sur la pointeur renvoyé par le segment de mémoire partagée. Lorsque j'ai copié ces données explicitement en utilisant memcpy sur ce pointeur, puis construit mon QByteArray en utilisant les données copiées, les erreurs seg se sont arrêtées.

Questions connexes