расхождения между выводом GDB и выводом терминала - PullRequest
0 голосов
/ 05 марта 2012

У меня какая-то странная проблема.Я делаю очередь с общей памятью для класса ОС, которая в основном имитирует проблему потребителя производителя.В одной из моих функций putBuffer(), которая вставляет элемент в общий буфер, я не получаю никакого вывода после определенной точки, поэтому я запускаю его через gdb, он печатает то, что, как я думал, будет печататься во время начального запуска терминала и когда я выйду из gdbон говорит, что программа завершилась нормально, поэтому я не совсем уверен, где моя ошибка.Кто-нибудь еще сталкивался с чем-то подобным?

, поэтому, когда я запускаю его через gdb, он печатает "прошел первоначальную проверку и значение fifo->[12], которое просто устанавливается здесь с жестко закодированным значением для целей тестированияно в терминале только распечатки "прошёл начальную проверку".Я даже убедился, что ошибки не было в printf() Есть мысли?Вот код

int putBuffer(FIFO_QUEUE *fifo, int element)
{
printf("made it past initial check\n"); 
fifo->queue[12] = 23;
//insert the element at the next available position IFF there is one

if(printf("made it to putBuffer and fifo->queue[12] = %d\n", fifo->queue[12]) < 0)
    {
        printf("error in putBuffer\n");
        return -1;
}
//determine whether or not we need to "wrap" around to the beginning of the queue
if(fifo->putPos == fifo->size - 1)
    fifo->putPos = 0;  //wrap to the beginning
else
    fifo->putPos++;

//increment the number of items in the queue
fifo->numItems++;

//if all went well return 0
  return 0;

}

для каждого запроса здесь - это определение FIFO_QUEUE. Я динамически распределяю структуру очереди в другой функции, но она хранит значения и печатает через gdb

typedef struct fifoQueue{
int *queue;
int putPos;     //next position to insert to
int rmPos;      //next position to remove from
int numItems;   //number of items currently in the queue
int size;           //the max size of the queue
}FIFO_QUEUE;

Вот где я думаю, что я ошибаюсь, мне нужно динамически распределить очередь fifo в функции, и я пытаюсь сделать это с помощью memcpy, чтобы в основном создать очередь fifo, а затем скопировать ее содержимое в мою общую памятьно, кажется, есть разрыв из-за int * в FIFO_QUEUE, и я не могу понять.где я иду не так.Я подозреваю, что это как-то связано с динамическим размещением функции в mkBuffer (), я думал, что memcpy просто скопирует 100 байтов того, что там было, но я могу ошибаться

code for dynamic allocation

#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/types.h>
#include<stdlib.h>
#include<stdio.h>

#include <fcntl.h>           /* For O_* constants */
#include <sys/stat.h> 
#include<string.h>
#include "fifoQueue.h"


FIFO_QUEUE *makeBuffer(int size);


int main(int argc, char *argv[])
{
//our buffer
int i = 0;
int segment_id = 0;
FIFO_QUEUE *sharedBuff;
FIFO_QUEUE *fifo = NULL;

fifo = makeBuffer(25);

//-------retrieve COMMAND LINE arguments------//
if(argc != 2)
  {
    printf("getBuffer requires 2 command line args\n");
    exit(-1);
  }

//------SET UP SHARED MEMORY--------//

//get memory ID
segment_id = atoi(argv[1]);
printf("MAKE_BUFFER:  Shared mem seg Id in get buffer = %d\n", segment_id);

//Attach
sharedBuff = (FIFO_QUEUE*)shmat(segment_id, NULL, SHM_RND);

  //COPY contents of fifo into shared mem
memcpy((void*)sharedBuff, (void*)fifo, 120);


//--------CLEANUP--------//

//DETACH shared mem
shmdt(sharedBuff);

//deallocate memory
  rmBuffer(fifo);

  return 0;
}

/*  makeBuffer()
    Description:    
        - Creates a FIFO buffer of integers of size <size>
*/
FIFO_QUEUE *makeBuffer(int size)
{
//variables
int i = 0;
FIFO_QUEUE *fifo = NULL;

//allocate room for our struct
fifo = (FIFO_QUEUE*)malloc(sizeof(FIFO_QUEUE));

//allocate room for our queue
fifo->queue = (int*)malloc(sizeof(int) * size);

//set the initial position and number of items in the queue to 0
fifo->putPos = 0;
fifo->rmPos = 0;
fifo->numItems = 5;
fifo->size = size;
//return our pointer
return fifo;

}

1 Ответ

1 голос
/ 05 марта 2012

Это:

memcpy((void*)sharedBuff, (void*)fifo, 120); /* Why 120 ? */

скопирует 120 байтов из fifo: он не скопирует динамически распределенный массив fifo.queue. Поскольку число элементов, необходимое для queue, жестко закодировано, измените определение FIFO_QUEUE на:

typedef struct fifoQueue{
    int queue[25];
    int putPos;     //next position to insert to
    int rmPos;      //next position to remove from
    int numItems;   //number of items currently in the queue
    int size;       //the max size of the queue: always 25
}FIFO_QUEUE;

и измените memcpy() на:

memcpy(sharedBuff, fifo, sizeof(*fifo));
...