Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [C] SIGSEGV (Segmentation fault)

    Ciao a tutti,

    da poco sono stato costretto ad installare Windows 8. Dopo aver configurato MinGw + NetBeans, ho provato a fare il porting di un semplice programma che stavo facendo su Linux. Ho notato che su winzoz, se metto come dimensione dell'array 1'600'000, il programma compila ma non parte! Mentre su Linux andava alla perfezione! Se invece diminuisco la dimensione a 160'000 tutto funziona come dovrebbe.

    Ho notato che, facendo il debug, mi da questo errore durante l'esecuzione:

    codice:
    Signal received: SIGSEGV (Segmentation fault)
    e mi viene segnalato in questa porzione di codice:

    codice:
    void msort(long a[], long n) {
    	long aux[n]; // parte che genera errore
    	mergesort(a, 0, n-1, aux);
      }
    Vi posto il source completo:

    fastSortingTest.c
    sorting.c

    Ho provato a cambiare tutti gli int in long pensando fosse questo il problema... ma a quanto pare no.

    La cosa strana è che lo stesso codice funziona perfettamente su Linux con array di dimensioni anche molto maggiori! Come mai questa cosa?

    Spero che riusciate a darmi una mano.

    Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Mhm non so cosa intendi per debug, ma se hai fatto il debug con il debugger dovresti ben sapere cosa è un "Segmentation fault", basta che ti fai stampare il backtrace dal debugger. Ciao.

  3. #3
    lol si... ho usato il debugger ^__^

    Cosa devo fare?

    non sono molto pratico... è la prima volta che uso netbeans...

    Grazie

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Mai usato netbeans per il C, il fatto è che hai scritto "parte che genera errore", mentre il sigsegv è generato da 1 singola riga, che sarebbe bene sapere qual'è (è long aux[n]; ?), inoltre aiuterebbe che trovassi il comando per stampare il "backtrace" e lo riportassi. Ciao.

  5. #5
    Non so veramente come riportarti questo backtrace perchè non ho la minima idea di cosa sia o di cosa possa essere... Ho provato a cercare nelle view di netbeans ma non c'è nulla di minimamente simile... l'unico output che mi riporta netbeans è quello che ti ho scritto... Ha qualche sinonimo il backtrace? magari viene chiamato in un altro modo...ti faccio un screenshot di netbeans:



    Come vedi il debugger in basso non mi da nessun output...

    La riga incriminata sembrerebbe essere proprio quella:

    long aux[n];


    In ogni caso grazie mille per l'aiuto... non so più dove andare a parare!

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Il problema è determinato da uno "stack overflow".

    Stai tentando di allocare 6,4 M nello stack e con le impostazioni di default non è possibile (almeno con quel compilatore e con Windows)

    Non conosco le caratteristiche del compilatore/linker ma con Visual C++ avresti dovuto impostare per il linker l'opzione

    /STACK:100000000

    per non avere problemi.

    Oppure, soluzione più sensata, allochi dinamicamente il vettore aux
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Ok ci provo.

    Domanda per curiosità... Per caso sai dirmi per quale motivo su sistemi "Linux like" questo non capita?

    Modifica:

    Sei un grande! Funziona! L'a cosa che non capisco è perchè devo allocare dinamicamente solo l'array ausiliario e gli altri no... bah...

    Provo ad auto-rispondermi... può essere che sia l'array aux che uso che va a riempire lo stack?

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    T'ho già detto ... dipende dal fatto che su Linux il compilatore ha riservato più spazio allo stack. Ma è una impostazione che puoi variare anche con Windows

    P.S. Windows e non winzoz
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Ok, quindi immagino sia un'impostazione di MinGw oppure è un flag che devo aggiungere alla compilazione con gcc?

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    gcc foo.c -o foo -Wl,-stack,8000000
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.