Управление памятью операционной системы, seg-fault? - PullRequest
0 голосов
/ 09 ноября 2018

Я реализую свою собственную malloc функцию под названием kalloc.

Но я получаю ошибку сегментации. Я установил объем памяти на 100. int _size = 4 сейчас, но ошибка сегментации происходит в 3-м цикле в main().

void* kalloc(int _size) {
    void* ptr = NULL;  
    struct ListNode* freeMem = kallocator.free_memory;
    struct ListNode* allocMem = kallocator.allocated_memory;
    struct KBlock* freeBlock;
    freeBlock = freeMem->item;
    struct KBlock* allocBlock = (struct KBlock*) malloc(sizeof(struct KBlock));
    if(kallocator.aalgorithm == FIRST_FIT){
        while(freeMem){
            if(freeBlock->size >= _size){
                allocBlock->size = _size;
                allocBlock->address = freeBlock->address;
                struct ListNode* listnode = List_createNode(allocBlock);
                List_insertTail(&allocMem, listnode);
                printf("size of freeBlock: %d\n", freeBlock->size);
                printf("address of freeBlock: %p\n", freeBlock->address);
                ptr = freeBlock->address;
                printf("Pointer value: %p\n", ptr);
                freeBlock->address = freeBlock->address + _size;
                allocMem = allocMem->next;
                freeBlock->size = freeBlock->size - _size;
                printf("allocBlock size: %d\n", allocBlock->size);
            }
            else{
                printf("Not enough space in memory\n");
                return NULL;
            }
            freeMem = freeMem->next;
        }

    }
    else if(kallocator.aalgorithm == BEST_FIT){

    }
    else if(kallocator.aalgorithm == WORST_FIT){

    }
    else{
        printf("No algorithm chosen\n");
        exit(-1);
    }

    // Allocate memory from kallocator.memory 
    // ptr = address of allocated memory
    return ptr;
}

Пожалуйста, помогите мне выяснить, почему seg fault происходит.

1 Ответ

0 голосов
/ 09 ноября 2018

Пожалуйста, попробуйте GDB отследить, где происходит ошибка сегмента. Предполагая, что вы работаете в Linux / Unix, скомпилируйте код с параметрами (если компилятор gcc)

gcc -ggdb -g3 <.c file> -o <progname>

Выполнить progname с GDB как

gdb <progname>

По приглашению GDB

gdb> run

В приглашении segfault GDB будет показано, где вы проверяете возврат, как

gdb> bt

Он покажет номер строки, в которой произошла ошибка, вместе со стеком вызовов функций (кадры с номером) Для проверки значений переменных или указателей используйте команду печати gdb

gdb> p <varnams>

Чтобы проверить конкретную функцию в стеке вызовов, перейдите к этому кадру стека как

gdb> frame <frame number>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...