Как я могу понять, почему функция имеет ошибку сегментации - PullRequest
0 голосов
/ 05 мая 2020

Другие мои функции, которые я использовал в этой программе, отлично работают после выполнения, но у этого метода есть дамп ядра ошибки сегментации, возникающий через несколько секунд после его загрузки. Кто-нибудь может распознать проблему? Я попытался отладить и выяснить, почему это происходит только с этой функцией, и я не могу понять, почему.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

int flag = 0, var, currFrame = 0, numFault, currRequest,minRequest,maxRequest ,request;
int numPages, numFrames, numRequest, fc =0, go =0, c =0;
void opt();

void runningMessage(int pg, int frame, int msg){

        if(msg == 1)
        {
                printf("Page %d already in Frame %d\n",pg, frame);
        }
        if(msg == 2)
        {
                printf("Page %d loaded into Frame %d\n",pg, frame);
        }
        if(msg == 3)
        {
                printf("Page %d unloaded from Frame %d\n",pg, frame);
        }


int main(int argc, char *argv[])
{
        FILE *fp;
        fp = fopen(argv[1], "r");
        int x =0;
        fscanf(fp, "%d %d %d", &numPages, &numFrames, &numRequest);
        int pgAccess[numRequest],pgArray[numPages], pgRequest[numRequest];
        while(!feof(fp))
        {
                fscanf(fp, "%d", &pgAccess[x]);
                x++;
        }
        fclose(fp);
        printf("Algorithm: %s\n\n", argv[2]);
        var = numRequest;
        if(strcmp(argv[2] ,"FIFO") == 0)
        {
                fifo(&pgArray, &pgAccess, numPages, numFrames, numRequest, var);
        }
        else if(strcmp(argv[2], "LRU") == 0)
        {
                lru(pgArray, pgAccess, pgRequest, numPages, numFrames, numRequest, var);
        }
        else if(strcmp(argv[3], "OPT") == 0)
        {
                opt(pgArray, pgAccess, pgRequest, numPages, numFrames, numRequest);
        }


}

void opt(int *pgArray, int *pgAccess, int *pgRequest, int numPages, int numFrames, int numRequest){

        int i=0, x=0, y, a;

        for(i = 0; i < numFrames; i++)
        {
                pgRequest[i] = 0;
                pgArray[i] = -1;
        }

        for(i = 0; i < numRequest; i++)
        {
                flag = 0;
                a = pgAccess[i];
                for(y = 0; y < numFrames; y++)
                {
                        if(a == pgArray[y])
                        {
                                flag = 1;
                                runningMessage(pgArray[y], y, 1);
                                break;
                        }
                }

                if((flag == 0) && (x < numFrames))
                {
                        fc++;
                        pgArray[x] = a;
                        runningMessage(pgArray[x], x, 2);
                        x++;
                }

                else if((flag == 0) && (x == numFrames))
                {
                        fc++;
                        for(go = 0; go < numFrames; go++)
                        {
                                pgRequest[go] = 0;
                        }
                        for(currRequest = 0; currRequest < numFrames; currRequest++)
                        {
                                c = 0;
                                for(currFrame = i + 1; currFrame < numRequest; currFrame++);
                                {
                                        if(pgArray[currRequest] == pgAccess[currFrame])
                                        {
                                                if(pgRequest[currRequest] == 0)
                                                {
                                                        pgRequest[currRequest] = currFrame;
                                                        c = 1;
                                                }
                                        }
                                }
                                if(c != 1)
                                {
                                        pgRequest[currRequest] = numRequest + 1;
                                }
                        }
                        request = 0;
                        maxRequest = pgRequest[0];
                        for(go = 0; go < numFrames; go++)
                        {
                                if(pgRequest[go] > maxRequest)
                                {
                                        maxRequest = pgRequest[go];
                                        runningMessage(pgArray[go], go, 3);
                                        request = go;
                                }
                        }
                        pgArray[request] = a;
                        runningMessage(pgArray[request], request, 2);
                }
        }
        printf(" %d Page Faults\n\n", fc);
}

1 Ответ

0 голосов
/ 05 мая 2020
else if(strcmp(argv[2], "LRU") == 0) { /* whatever */ } 
else if(strcmp(argv[3], "OPT") == 0)

Вот почему, если вы передадите "OPT", вы получите segfault.

Отладка segfault:

  • Прочтите свой код (в этом случае проблема заканчивается здесь)
  • Запустите valgrind или любую другую программу проверки памяти, которая вам нравится
  • Получить дамп ядра и выполнить обратную трассировку
...