Das C-Programm bleibt während der Ausführung hängenLinux

Linux verstehen
Anonymous
 Das C-Programm bleibt während der Ausführung hängen

Post by Anonymous »

Ich habe ein C-Programm und verwende Meson+Ninja, um es zu erstellen.

Code: Select all

project('NESt', 'c')

source_files=files('src/main.c',
'src/App.h', 'src/App.c',
'src/Emulator.h', 'src/Emulator.c',
'src/Mapper.h', 'src/Mapper.c',
'src/CPU.h', 'src/CPU.c',
'src/MMU.h', 'src/MMU.c'

)

executable('NESt', source_files, dependencies: dependency('sdl2'))
Das Problem beginnt hier. Sobald ich MMU.h und .c zum Projekt hinzufüge, wird es normal kompiliert, bleibt jedoch hängen, sobald ich es mit einer einzelnen Zeile auf dem Terminal ausführe:

Cookie-Datei konnte nicht abgeschnitten werden: Ungültiges Argument

Das Terminal friert ein und Strg+C funktioniert nicht; Ich kann nur die Terminalinstanz schließen und eine andere öffnen. Ich habe auch den Laptop neu gestartet, aber er war immer noch da.
Ich verwende Linux Mint.
MMU.h

Code: Select all

#include

typedef struct
{
//either we can have 64kb virtual mem or in my case original 2kb memory
uint8_t memory[2*1024];

} MMU;

void write(MMU *mmu, uint16_t addr, uint8_t data);
uint8_t read(MMU *mmu, uint16_t addr);
MMU.c

Code: Select all

#include "MMU.h"
#include "Mapper.h"

void write(MMU *mmu, uint16_t addr, uint8_t data)
{
//(mmu->memory)[addr]=data;
}

uint8_t read(MMU *mmu, uint16_t addr)
{
if (addrmemory)[(addr%(2*1024))];

else if (addr>(1024*32))
{
//call the mapper and then do stuff;
}

//how handle error
return 0;
}
Da Mapper auch viel Speicher zuweist, hier Mapper.c.
Mapper.c

Code: Select all

#include "Mapper.h"

#include 
#include 
#include 

//maybe better error handling or just bool is fine?
bool load_ROM(Mapper *mapper, const char* filepath)
{
FILE *file = fopen(filepath, "rb");
if(!file)
{
//log the error
perror("");
return false;
}

char header[16];

if(!fread(header, 1, 16, file))
{
perror("Error Reading File");
return false;
}

if (memcmp(header, "NES\x1A", 4)!=0)
{
perror("Invalid ROM");
return false;
}

//16kb units
mapper->PRG_ROM.size=header[4]*16*1024;
//8kb units
mapper->CHR_ROM.size=header[5]*8*1024;

//read the prg and chr rom data

mapper->PRG_ROM.data = malloc(mapper->PRG_ROM.size);
if(!mapper->PRG_ROM.data)
{
perror("1");
return false;
}
if(!fread(mapper->PRG_ROM.data, 1, mapper->PRG_ROM.size, file))
{
perror("2");
return false;
}

mapper->CHR_ROM.data = malloc(mapper->CHR_ROM.size);
if(!mapper->CHR_ROM.data)
{
perror("3");
return false;
}

if(!fread(mapper->CHR_ROM.data, 1, mapper->CHR_ROM.size, file))
{
perror("4");
return false;
}

fclose(file);
//can this fail?

//for now
free(mapper->CHR_ROM.data);
free(mapper->PRG_ROM.data);

return true;
}

void init_mapper(Mapper *mapper)
{
if(!load_ROM(mapper, "test.nes"))
{
perror("Failed to load ROM");
return;
}
}
Bitte beurteilen Sie nicht meinen schlechten Code. Ich lerne immer noch.
Ich habe versucht, es zu debuggen. Wenn ich das Programm dort beende, wo es hängen bleibt, erhalte ich Folgendes:

Code: Select all

Failed to truncate cookie file: Invalid argument
^C
Thread 1 "NESt" received signal SIGINT, Interrupt.
0x00007ffff7a98d71 in __futex_abstimed_wait_common64 (private=0, cancel=true,
abstime=0x0, op=393, expected=0, futex_word=0x555555596c8c)
at ./nptl/futex-internal.c:57
warning: 57 ./nptl/futex-internal.c: No such file or directory
(gdb) where
#0  0x00007ffff7a98d71 in __futex_abstimed_wait_common64 (private=0,
cancel=true, abstime=0x0, op=393, expected=0, futex_word=0x555555596c8c)
at ./nptl/futex-internal.c:57
#1  __futex_abstimed_wait_common (cancel=true, private=0, abstime=0x0,
clockid=0, expected=0, futex_word=0x555555596c8c)
at ./nptl/futex-internal.c:87
#2  __GI___futex_abstimed_wait_cancelable64 (
futex_word=futex_word@entry=0x555555596c8c, expected=expected@entry=0,
clockid=clockid@entry=0, abstime=abstime@entry=0x0,
private=private@entry=0) at ./nptl/futex-internal.c:139
#3  0x00007ffff7a9b7ed in __pthread_cond_wait_common (abstime=0x0, clockid=0,
mutex=0x55555558ca30, cond=0x555555596c60)
at ./nptl/pthread_cond_wait.c:503
#4  ___pthread_cond_wait (cond=0x555555596c60, mutex=0x55555558ca30)
at ./nptl/pthread_cond_wait.c:627
#5  0x00007ffff7c9d604 in pa_threaded_mainloop_wait ()
from /lib/x86_64-linux-gnu/libpulse.so.0
#6  0x00007ffff7ec81fd in ?? () from /lib/x86_64-linux-gnu/libSDL2-2.0.so.0
#7  0x00007ffff7ec9b37 in ?? () from /lib/x86_64-linux-gnu/libSDL2-2.0.so.0
#8  0x00007ffff7df9ec4 in ?? () from /lib/x86_64-linux-gnu/libSDL2-2.0.so.0
#9  0x00007ffff7dfa567 in ?? () from /lib/x86_64-linux-gnu/libSDL2-2.0.so.0
#10 0x00005555555553e4 in app_init (app=0x7fffffffdd10, argc=1,
argv=0x7fffffffde78) at ../src/App.c:291
Hier bleibt es hängen:

Code: Select all

if (SDL_Init(SDL_INIT_EVERYTHING)){....}
Wenn ich SDL_INIT_EVERYTHING in SDL_INIT_VIDEO ändere, funktioniert es wieder normal. Warum passiert es, wenn ich keine Änderungen an der SDL2-Seite vorgenommen habe?
Update: Es stellte sich heraus, dass die Lese- und Schreibvorgänge nicht richtig als mmu_read und mmu_write benannt wurden. Die neue Definition von Lesen und Schreiben störte die vorhandenen C-Funktionen und verursachte daher dieses Problem, das jetzt gelöst ist.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post