kfoynt Δημοσ. 22 Ιουλίου 2010 Δημοσ. 22 Ιουλίου 2010 Χαλοο Παίρνω segmentation fault όταν κάνω μια απλή ανάθεση μεταβλητής όταν χρησιμοποιώ κατα το compile την επιλογή -O2. Γιατι??? Ευχαριστώ..!
kfoynt Δημοσ. 23 Ιουλίου 2010 Μέλος Δημοσ. 23 Ιουλίου 2010 Να δούμε λίγο κώδικα; ναι, σωστά... αν και δεν νομίζω να βοηθήσει γιατι ειναι πολύ απλός. Λοιπόν, δεν μπορώ να φανερώσω συγκεκριμένα πράγματα γιατι έχω υπογράψει, αλλα μια γενική ιδέα μπορώ να δώσω: > long var; // δήλωση μεταβλητής if ( L->iterslv > 0 && L->mtxF != 1 ) { var = 8 * ( L->max_m + L->max_n ); } else { var = 2; } VECT(L->var, double, var); if ( L->var == NULL ) { printf("solver: failed for var.\n"); exit(1); } L->lvar = var; // XXX εδώ μου πετάει το segmentation Ο L pointer δειχνει σε μία structure, η οποία υπάρχει στην μνήμη κανονικά, το τσέκαρα απο τον debugger. Επίσης η L->lvar υπάρχει στην μνήμη και έχει την τιμή που της έδωσα σε μία άλλη function. Τέλος η var ύστερα απο τα if statements παίρνει την τιμή 2, επίσης το τσέκαρα. Αλλά!! όταν πάω να κάνω την ανάθεση L->lvar = var; παίρνω segmentation fault, η οποία ανάθεση, άμα δεν χρησιμοποιήσω το option -O2 δουλεύει μια χαρά.
bnvdarklord Δημοσ. 23 Ιουλίου 2010 Δημοσ. 23 Ιουλίου 2010 Τι ακριβώς κανει το option -O2? Ειναι απαραίτητο να το χρησιμοποιήσεις εφόσον δουλευει κανονικά χωρις αυτο?
kfoynt Δημοσ. 23 Ιουλίου 2010 Μέλος Δημοσ. 23 Ιουλίου 2010 θα ήταν δύσκολο να στείλεις κάτι compileable; Δυστυχώς ναι, θα πρέπει να πάρω άδεια πρώτα. To -O2 option κάνει αυτό: Do not use compiler optimization directive such as "-O" or "-O2" which rearrange computing operations to gain speed as this reordering will not match the order of execution in the source code and it may be impossible to follow. και μάλλον αυτό ειναι και το πρόβλημα? τι γνώμη έχετε? Edit: Ναι, μπορώ να το τρέξω και χωρίς αυτό, αλλά ο κόσμος εκει έξω είναι πολύ ανταγωνιστικός
kfoynt Δημοσ. 23 Ιουλίου 2010 Μέλος Δημοσ. 23 Ιουλίου 2010 καλό debugging λοιπόν κρίμα.. θα ήθελα να ακούσω κάτι πιο ενθαρρυντικό
nplatis Δημοσ. 23 Ιουλίου 2010 Δημοσ. 23 Ιουλίου 2010 Η επιλογή -O2 κανονικά δεν πρέπει να προκαλεί τέτοιες παρενέργειες. Μάλλον λάθος στον κώδικα υπάρχει... Χρησιμοποιείς την επιλογή -Wall; Συχνά δείχνει χρήσιμα πράγματα. Επίσης: είσαι απόλυτα σίγουρος ότι με το -O2 κερδίζεις στην πράξη στην εφαρμογή σου;
kfoynt Δημοσ. 23 Ιουλίου 2010 Μέλος Δημοσ. 23 Ιουλίου 2010 Η επιλογή -O2 κανονικά δεν πρέπει να προκαλεί τέτοιες παρενέργειες. Μάλλον λάθος στον κώδικα υπάρχει... Χρησιμοποιείς την επιλογή -Wall; Συχνά δείχνει χρήσιμα πράγματα. Επίσης: είσαι απόλυτα σίγουρος ότι με το -O2 κερδίζεις στην πράξη στην εφαρμογή σου; Οχι την -Wall δεν την έχω δοκιμάσει, αλλα το πρωί με το καλο θα την δοκιμάσω, δεν έχω να χάσω κάτι. Η εφαρμογή είναι 20 χρονών δουλεια κάποιου καθηγητή, για να έχει βάλει το -O2 λογικά κάτι θα ξέρει, αλλα θα το διπλοτσεκάρω. Τώρα για το αν έχω λάθος, και έγω το ίδιο πίστευα... αλλα οι εντολές που εκτελώ και μου δινουν το segmentation ειναι πολύ απλές + αν βγάλω το -Ο2 δουλεύει αρα? μάλλον θα φταιει αυτό που έκανα quote πιο πάνω και χρειάζομαι καλύτερη διαχείριση των μεταβλητών για να ταιριάζει με την ροή του -Ο2?
nplatis Δημοσ. 23 Ιουλίου 2010 Δημοσ. 23 Ιουλίου 2010 Δεν ξέρω πού βρήκες αυτό το σχόλιο, γενικά το -O2 θεωρείται μάλλον ασφαλές. Κάτι ακόμα: μήπως η εφαρμογή αποτελείται από πολλά αρχεία κώδικα; Αν ναι, μην ξεχνάς να τα κάνεις όλα compile από την αρχή εφόσον αλλάζεις τέτοιες παραμέτρους.
ippo00 Δημοσ. 23 Ιουλίου 2010 Δημοσ. 23 Ιουλίου 2010 Επειδή παω για ύπνο, θα τολμίσω να πω ότι κανείς δεν θα μυρίσει τα νύχια του να το λύσει. Δεν το έννοο με τον αγενή τρόπο αλλά αν δεν μπορείς έστω να στίλεις binary με τα debugging symbols..
Evgenios1 Δημοσ. 23 Ιουλίου 2010 Δημοσ. 23 Ιουλίου 2010 L->lvar = var; Αντι για αυτο βαλε > __asm { mov ecx,dword ptr [var] mov eax,dword ptr [L] mov dword ptr [eax+(Το offset του lvar)],ecx }
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.