Moderators Kercyn Δημοσ. 25 Μαρτίου 2014 Moderators Δημοσ. 25 Μαρτίου 2014 Καλησπέρα σε όλους. Γράφω ένα πρόγραμμα που χρησιμοποιεί OpenGL και δεν ξέρω πώς ακριβώς να κάνω το error handling. Διαβάζω στο documentation ότι πολλές συναρτήσεις αποτυγχάνουν "σιωπηλά", δηλαδή όταν μια συνάρτηση έχει, πχ, λάθος παραμέτρους, απλώς δεν κάνει τίποτα. Επειδή αυτή η συνάρτηση μπορεί να είναι σημαντική και να αποτύχει κάτι άλλο πιο κάτω επειδή η πρώτη δεν έτρεξε σωστά, θέλω να φτιάξω ένα σύστημα που να πιάνει τέτοια λάθη. Διάβασα σε πολλά άρθρα στο Internet και σε διάφορα threads στο Stack Overflow ότι ένας τρόπος είναι να φτιάξεις ένα macro που να ελέγχει αν η συνάρτηση απέτυχε και μετά να καλείς όλες τις συναρτήσεις τις OpenGL μέσω αυτού του macro, κάπως έτσι: void CheckOpenGLError(const char* stmt, const char* fname, int line) { GLenum err = glGetError(); if (err != GL_NO_ERROR) { printf("OpenGL error %08x, at %s:%i - for %s\n", err, fname, line, stmt); abort(); } } #ifdef _DEBUG #define GL_CHECK(stmt) do { \ stmt; \ CheckOpenGLError(#stmt, __FILE__, __LINE__); \ } while (0) #else #define GL_CHECK(stmt) stmt #endif και στη συνέχεια GL_CHECK( glBindTexture2D(GL_TEXTURE_2D, id) ); Το παράδειγμα είναι από το SO. Άλλα sites λένε να φτιάξεις μια συνάρτηση που να καλεί την glGetError μετά από κάθε batch OpenGL συναρτήσεων για να πιάνει το τελευταίο λάθος. Αυτό που δεν καταλαβαίνω είναι το #ifdef _DEBUG. Έστω ότι έκανα debug την εφαρμογή μου και δουλεύει μια χαρά κλπ κλπ, γιατί πρέπει στο release version να μη γίνεται αυτός ο έλεγχος; Πώς μπορώ να προστατευθώ από runtime errors; Υποθέτω ότι αν βγάλω το #ifdef θα δουλεύει, αλλά σε όποιο site είδα να χρησιμοποιείται αυτή η προσέγγιση πάντα υπήρχε ένα directive που όριζε debugging mode. Υπάρχει κάποιος αποτελεσματικός τρόπος να διασφαλίσω ότι η εφαρμογή θα πιάνει τα λάθη και σε release version; Ευχαριστώ
migf1 Δημοσ. 25 Μαρτίου 2014 Δημοσ. 25 Μαρτίου 2014 Βασικά είναι καθαρά δικιά σου η επιλογή για το ποια σφάλματα θα κάνεις catch, καθώς και το πότε και που θα τα εμφανίζεις. Επίσης δεν είναι είναι απαραίτητο να έχεις μόνο DEBUG directive, μπορείς να έχεις και RUNTIME directive, αν και το τελευταίο συνήθως συγκαταλέγεται στο default output του προγράμματος. Γενικώς, μπορείς να έχεις διάφορα directives, και να τα συνδυάζεις (ή και όχι). π.χ. εκτός του DEBUG μπορείς να έχεις κι ένα VERBOSE directive, και να βάλεις τις συναρτήσεις σου π.χ. όταν πιάσουν ένα σφάλμα σε debugging mode να το γράφουν σε κάποιο log αρχείο, και να το γράφουν και στην οθόνη μονάχα αν είναι ενεργό και το VERBOSE directive. Το ποια per-processor directives θα είναι ενεργά και ποια όχι, μπορούν να καθοριστούν και στην γραμμή εντολών κατά τη διάρκεια του compilation (π.χ. με -D στον gcc). Εναλλακτικά των directives, μπορείς να χρησιμοποιήσεις command line arguments στο πρόγραμμά σου, οπότε εκεί ουσιαστικά δίνεις τον έλεγχο στον χρήστη να αποφασίσει πώς θέλει να συμπεριφερθεί το πρόγραμμά σου. Προφανώς μπορείς να έχεις και συνδυασμό directives με command line arguments.
Moderators Kercyn Δημοσ. 25 Μαρτίου 2014 Μέλος Moderators Δημοσ. 25 Μαρτίου 2014 Μάλιστα, δηλαδή δεν είναι "λάθος" να χρησιμοποιώ τα ίδια macros και σε release build, έτσι; Ρωτάω επειδή δεν έχω εμπειρία με OpenGL και δεν ξέρω αν υπάρχει κάποιος "στάνταρ" τρόπος να γίνεται το error handling.
migf1 Δημοσ. 25 Μαρτίου 2014 Δημοσ. 25 Μαρτίου 2014 Μάλιστα, δηλαδή δεν είναι "λάθος" να χρησιμοποιώ τα ίδια macros και σε release build, έτσι; Ρωτάω επειδή δεν έχω εμπειρία με OpenGL και δεν ξέρω αν υπάρχει κάποιος "στάνταρ" τρόπος να γίνεται το error handling. Συγκεκριμένα με OpenGL δεν έχω ούτε εγώ πρόσφατη εμπειρία. Αλλά όχι, δεν είναι λάθος. Το πρόβλημα είναι πως αν μιλάμε για speed-critical εφαρμογές, τότε οι παραπανίσιοι έλεγχοι κοστίζουν. Οπότε, έχεις ένα debugging εκτελέσιμο με pre-processor directives για να πιάνει και να τυπώνει τα σφάλματα ώστε να τα διορθώνεις κι όταν έχεις τελειώσει με το beta testing, απλώς ΔΕΝ ορίζεις το DEBUG directive στο compilation του release εκτελέσιμου (οι έλεγχοι στον προπεξεργαστή δεν επηρεάζουν την ταχύτητα του εκτελέσιμου).
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα