Domanda sulla segmentazione

genny92c

Nuovo Utente
103
6
Salve. Avrei una domanda sulla segmentazione ma non per quanto riguarda la gestione della memoria nei sistemi operativi:

Ho sviluppato un programma multithread di una traccia di esame di Sistemi operativi utilizzando la libreria e i metodi di pthread.h
Però non so per quale ragione all'esecuzione del programma, esso si blocca dandomi come errore "Errore di segmentazione (core dump creato)"

Ho chiesto aiuto al prof, ma non mi ha saputo aiutare, quindi ora no so proprio come fare

Se foste cosi gentili da aiutarmi, vi metto in allegato il pdf della traccia di esame e il mio svolgimento con allegato il makefile per la compilazione , anche se sarei più interessato a capire che tipo di problema è e a cosa e dovuto, piuttosto che ad una correzione
 

Allegati

  • Programma.zip
    97.5 KB · Visualizzazioni: 36

Andretti60

Utente Èlite
6,440
5,091
che sistema operativo usi? Dovrebbe essere un simil Unix, tipo Linux. Se hai un debugger installato, tipo gdb, puoi usarlo per avere informazioni leggendo il core dump, ti dice esattamente in quale punto del programma c'e' stato un errore e puoi anche leggere il valore delle variabili in quel momento. Informazioni maggiori le ottieni compilando il tuo programma usando la opzione "-g" (cosa che consiglio sempre di fare durante la fase di sviluppo)

Ecco una introduzione generica sull'argomento:
https://web.eecs.umich.edu/~sugih/pointers/gdb_core.html
 

genny92c

Nuovo Utente
103
6
che sistema operativo usi? Dovrebbe essere un simil Unix, tipo Linux. Se hai un debugger installato, tipo gdb, puoi usarlo per avere informazioni leggendo il core dump, ti dice esattamente in quale punto del programma c'e' stato un errore e puoi anche leggere il valore delle variabili in quel momento. Informazioni maggiori le ottieni compilando il tuo programma usando la opzione "-g" (cosa che consiglio sempre di fare durante la fase di sviluppo)

Ecco una introduzione generica sull'argomento:
https://web.eecs.umich.edu/~sugih/pointers/gdb_core.html
Esatto: linux distro ubuntu
Proverò ad installare questo gdb e ti farò sapere. Non sono stato molto chiaro nel titoo perchè in realtà non ho ancora ben capito che tipo di problema è occorso, per questo chidevo proprio a voi non una correzione ma un chiarimento sulla cosa. a quanto pare però non avevo capito che il dump fosse una specie di file log
 

pabloski

Utente Èlite
2,868
916
Se foste cosi gentili da aiutarmi, vi metto in allegato il pdf della traccia di esame e il mio svolgimento con allegato il makefile per la compilazione , anche se sarei più interessato a capire che tipo di problema è e a cosa e dovuto, piuttosto che ad una correzione

Riguardo il cosa sia, non c'entra nulla col concetto di segmentazione usato dai processori 80x86. Quello è un trucco sviluppato da Intel per allargare lo spazio d'indirizzamento continuando però ad usare registri a 16 bit. Questo invece è un errore dovuto ad un tentativo del tuo programma di accedere ad un'area dello spazio d'indirizzamento che non gli è stata assegnata.

Cioè la memoria, nei sistemi operativi che implementano la memoria virtuale, non può essere acceduta semplicemente mettendo un numeretto in un registro. Il programma deve prima fare richiesta al sistema operativo, il quale gli allocherà o meno una certa quantità di memoria ( il programma le vede sotto forma di pagine di memoria virtuale ). Da quel momento in poi il programma potrà accedere alle locazioni di memoria virtuale ( relative al suo spazio d'indirizzamento ) che il sistema operativo gli ha concesso e che corrispondono ovviamente a zone di memoria fisica ( o no, se quella memoria è paged-out in quel momento ).

Se prendi per esempio

Codice:
int *p = numero_a_casaccio;

e provi ad accedere a quella locazione, il processore genererà un fault, catturato dal runtime del C, il quale genererà l'errore di segmentation fault.
 
  • Mi piace
Reazioni: Andretti60

Andretti60

Utente Èlite
6,440
5,091
Mi pare strano che il tuo insegnante non abbia saputo (o voluto) aiutarti. Una delle prime cose che si impara programmando in C è usare il file dump core, strumento eccezionale per scovare gli errori che occorrono a run time, in quanto il C non permette di "catturare" errori come per esempio Java e C++ (uno dei motivi per cui è più efficiente, e più difficile da usare)
 
Ultima modifica:

Andretti60

Utente Èlite
6,440
5,091
Correzione al mio post precedente: è possibile catturare certi errori in C usando l'istruzione Signal che permette di definire una funzione da chiamare in caso di certi interrupt, ma tale metodo è a livello globale per tutta la applicazione.
 

pabloski

Utente Èlite
2,868
916
Correzione al mio post precedente: è possibile catturare certi errori in C usando l'istruzione Signal che permette di definire una funzione da chiamare in caso di certi interrupt, ma tale metodo è a livello globale per tutta la applicazione.

Il problema è che SIGSEGV è rognoso da gestire. Posix non prevede un comportamento definito per un processo che incappi in un segmentation fault e per questo non c'è modo di implementare il signal handler in maniera deterministica.

In generale un segmentation fault generato da un bug lo si lascia accadere, con tanto di dump, e dopo si va a vedere dove sta il problema e si cerca di eliminarlo.

Però si può fare utilizzando sigaction e setjmp/longjmp. Sempre intendendo che è un meccanismo di debug e non un modo per "risolvere" il problema.
 
  • Mi piace
Reazioni: Andretti60

Andretti60

Utente Èlite
6,440
5,091
Il problema è che SIGSEGV è rognoso da gestire...
Fosse solo quello :) Concordo su tutto, infatti nel mio messaggio precedente non avevo nemmeno menzionato l'uso della signal() perché rognoso, e che infatti risolve ben pochi problemi (e' usato principalmente per gestire gli interrupt e nei device driver). Non per nulla i linguaggi moderni hanno il try and catch (e simili).
 

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu
Esatto: linux distro ubuntu
Proverò ad installare questo gdb e ti farò sapere. Non sono stato molto chiaro nel titoo perchè in realtà non ho ancora ben capito che tipo di problema è occorso, per questo chidevo proprio a voi non una correzione ma un chiarimento sulla cosa. a quanto pare però non avevo capito che il dump fosse una specie di file log
Scusa come fai a programmare senza saper debuggare? :popo:
 

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu
printf printf printf...alla lunga s'impazzisce ma funziona :D

scherzi a parte, se C/C++ avessero un REPL sarebbe un bell'aiuto per il debugging
Comunque cambia printf per il debug e usa fprintf
 

Andretti60

Utente Èlite
6,440
5,091
Printf() per il debug va bene se si prova il software in un computer dove non si ha un debugger installato, ma è pericoloso se lo si dimentica prima di mandare il codice in produzione. Io lo uso spesso, ma o racchiudo i printf() dentro un #ifdef (in modo da eliminarli in produzione) o preferisco scrivere in un log file o nel event log, che i clienti possono poi spedirmi se qualcosa va male.
Quando si impara a programmare, printf() va più che bene ma è inutile appena si impara a usare un debugger.
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!