Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

  • Moderators
Δημοσ.

Καλησπέρα και καλές γιορτές.

 

Έχω κάποιον κώδικα C++ σε VS2015 που μου πετάει access violation σε μια συγκεκριμένη γραμμή και θέλω να βάλω ένα breakpoint στη μνήμη που υπάρχει το πρόβλημα για να δω τι την πειράζει και πότε κλπ. Το πρόβλημα είναι ότι κάθε φορά που τρέχει η εφαρμογή η διεύθυνση αυτή αλλάζει. Υπάρχει κάποιος τρόπος να είναι σταθερή αυτή η μνήμη ή τέλος πάντων να κάνω κάτι για να δω τι προκαλεί το πρόβλημα;

 

 

Έχω ένα thread με ολόκληρο το πρόβλημα εδώ.

 

 

Ευχαριστώ.

Δημοσ.

Είδα στα γρήγορα το θρεντ. Όπως σου είπαν, δε γίνεται να βγει άκρη κοιτώντας έτσι γενικά κώδικα.

 

Ένα πράγμα που μου έκανε εντύπωση είναι ότι ακόμα και στο screenshot που έβαλες γίνονται 2-3-4 πράγματα σε μία γραμμή. Πώς και δεν την έκανες ακόμα τελείως λιανά, one function call or equivalent/LOC?

 

Επίσης αυτό που λες ακούγεται λίγο περίεργο... αν ξέρεις σε ποιό address γίνεται κάτι στραβό (έστω και διαφορετικό σε κάθε run) τότε μπορείς να βάλεις breakpoint στο σημείο που κάνει materialize αυτό το address -- προφανώς ξέρεις πού είναι αυτό το σημείο, αλλιώς πώς θα ήξερες ποιά είναι "η μνήμη που υπάρχει το πρόβλημα";

 

Τέλος, υποθέτω από αυτά που γράφεις (ότι βλέπεις τιμές 0xCD, 0xDD) ότι είσαι σε debug build. Όπως σου είπαν αυτά είναι magic values του debug mode allocator για να βοηθήσει να καταλάβεις τι γίνεται, π.χ. αν δεις κάπου ότι κάνεις dereference 0xDD τότε έχεις πιθανότατα use after free bug, κλπ. Δε χρειάζεται να σε απασχολεί εκτός κι αν καταλήξεις να κοιτάς την ένοχη περιοχή μνήμης και δεις κάποιο από αυτά τα magic vals.

 

PS Debug builds και symbols για τη MSVCRT και την SDL2 γιατί δεν έχεις φορτωμένα;

  • Moderators
Δημοσ.

Είδα στα γρήγορα το θρεντ. Όπως σου είπαν, δε γίνεται να βγει άκρη κοιτώντας έτσι γενικά κώδικα.

 

Η αλήθεια είναι ότι δε μου έχει ξανατύχει access violation σε εξωτερικό κώδικα και δεν ξέρω πώς να το αντιμετωπίσω. Τα μόνα access violations που έχω συναντήσει είναι βλακείες τύπου δεν έχω κάνει initialize ένα vector και πάω να πάρω κάτι από κει.

 

 

Ένα πράγμα που μου έκανε εντύπωση είναι ότι ακόμα και στο screenshot που έβαλες γίνονται 2-3-4 πράγματα σε μία γραμμή. Πώς και δεν την έκανες ακόμα τελείως λιανά, one function call or equivalent/LOC?

 

Για ποιο λες;

 

 

Επίσης αυτό που λες ακούγεται λίγο περίεργο... αν ξέρεις σε ποιό address γίνεται κάτι στραβό (έστω και διαφορετικό σε κάθε run) τότε μπορείς να βάλεις breakpoint στο σημείο που κάνει materialize αυτό το address -- προφανώς ξέρεις πού είναι αυτό το σημείο, αλλιώς πώς θα ήξερες ποιά είναι "η μνήμη που υπάρχει το πρόβλημα";

 

Ξέρω πού πετάει το violation και έχω breakpoint εκεί, αλλά ήθελα να ξέρω από πριν σε ποια περιοχή μνήμης θα γίνει για να βάλω breakpoint στη μνήμη όταν αλλάζει κάτι, για να ξέρω τι την έχει πειράξει.

 

 

PS Debug builds και symbols για τη MSVCRT και την SDL2 γιατί δεν έχεις φορτωμένα;

 

Γιατί τα symbols έμαθα τι είναι μ' αυτό το θέμα, μέχρι τώρα τα είχα απλώς ακουστά και δεν ήξερα τι κάνουν. Στο project χρησιμοποιώ τους symbol servers της Microsoft, δε θα έπρεπε να υπάρχουν για το MSVCRT; Απ' ό,τι έχω καταλάβει, για την SDL2 (και για οτιδήποτε δεν είναι της Microsoft), πρέπει να την κάνω build μόνος μου για να βγάλει τα symbols, σωστά;

Δημοσ.

Η αλήθεια είναι ότι δε μου έχει ξανατύχει access violation σε εξωτερικό κώδικα και δεν ξέρω πώς να το αντιμετωπίσω. Τα μόνα access violations που έχω συναντήσει είναι βλακείες τύπου δεν έχω κάνει initialize ένα vector και πάω να πάρω κάτι από κει.

Και αυτό που έχεις τώρα κάτι τέτοιο είναι. Όλα αυτά είναι deref κακού pointer, οπότε one of: use after free/use before init/buffer overrun.

 

Για ποιο λες;

Κάπου λες για step over line 37, τα έχεις ξετυλίξει όλα;

 

Ξέρω πού πετάει το violation και έχω breakpoint εκεί, αλλά ήθελα να ξέρω από πριν σε ποια περιοχή μνήμης θα γίνει για να βάλω breakpoint στη μνήμη όταν αλλάζει κάτι, για να ξέρω τι την έχει πειράξει.

 

Γιατί τα symbols έμαθα τι είναι μ' αυτό το θέμα, μέχρι τώρα τα είχα απλώς ακουστά και δεν ήξερα τι κάνουν. Στο project χρησιμοποιώ τους symbol servers της Microsoft, δε θα έπρεπε να υπάρχουν για το MSVCRT; Απ' ό,τι έχω καταλάβει, για την SDL2 (και για οτιδήποτε δεν είναι της Microsoft), πρέπει να την κάνω build μόνος μου για να βγάλει τα symbols, σωστά;

Nαι.

 

Αλλά πρώτα κοίτα τι κάνει η msvcrt επειδή απ' ότι είδα, η SDL δεν έχει dependency στο C runtime επομένως έχει και δικό της memory allocator και τα πάντα όλα. Παρόλα αυτά στο call stack που δίνεις "φαίνεται" πώς από SDL2 καλεί msvcrt... which does not make sense? Τι παίζει εκεί, πώς φτάσαμε σε τέτοιο call stack? Θέλεις debug build και symbols για τη msvcrt για να καταλάβεις.

 

Τώρα είδα ότι έφτασες μέχρι τη memcpy που καλείται από την SDL. Well wtf τότε με αυτό που διάβασα στο site τους ότι δεν έχουν dependency στο runtime? Όπως και να χει, αφού έχεις sources από την SDL θα κάνεις και ένα debug build με symbols και μετά step μέσα στον κώδικά τους τσολιάς. Hopefully αυτό θα σου δώσει περισσότερα clues για το τι συμβαίνει.

  • Moderators
Δημοσ.

Έβαλα τα symbols στην SDL και τώρα παίρνω αυτό το stack.

post-284325-0-96057600-1483101148_thumb.png

 

Απ' ό,τι φαίνεται και από τον κώδικα που κοιτάω πάει να αντιγράψει ένα RWops* και το RWops που πάει να αντιγράψει είναι σε μνήμη η οποία έχει καθαριστεί (ή τέλος πάντων δεν είναι έγκυρη), που δεν καταλαβαίνω γιατί γίνεται αλλά τουλάχιστον είναι μια πρόοδος. Θα ήθελα να έχω και τα symbols της libfreetype αλλά αυτή ήρθε έτοιμη με το SDL_TTF, οπότε δε μπορώ να την αλλάξω. Λογικά θα δοκιμάσω να κάνω build την SDL_TTF μήπως πάρω κάτι παραπάνω.

 

Ευχαριστώ πολύ!

  • Like 1
Δημοσ.

Ψάξου λίγο πρώτα σε επίπεδο SDL να δεις τι κάνει το source εκεί γύρω, μπορεί να σου έρθει κάποια ιδέα σχετικά εύκολα και να γλυτώσεις το τράβηγμα με τη libfreetype (αν και, κακό δεν είναι να αναγκαστείς να φτιάξεις fully debug capable build configuration).

 

At this stage θα μύριζα δάχτυλα ότι παίζει ενδεχόμενο η libfreetype να κάνει πράγματα που δεν πρέπει, το οποίο θα μπορούσε να οφείλεται σε:

  • Εσένα που δεν κατάλαβες σωστά κάποιο contract κάποιας SDL function που καλείς
  • Bug σε μία από τις δύο βιβλιοθήκες (υπαρκτή πιθανότητα αλλά obviously unlikely)
  • Mismatch ανάμεσα στο τι κάνει η libfreetype και τι περιμένει η SDL επειδή τα δύο DLL που έχεις δεν είναι συμβατά σε API (λάθος version της μίας που δεν περιμένει η άλλη) ή ABI (λάθος build) επίπεδο
  • Moderators
Δημοσ.

Τελικά ήταν το πρώτο :P

 

Ο RWops pointer από τον οποίο φορτώνω τα font data πρέπει να μείνει έγκυρος, αλλά όταν τελείωνε το function που φόρτωνε το font έβγαινε εκτός scope και μετά όταν προσπαθούσα να κάνω render χρησιμοποιώντας το font πήγαινε στον RWops pointer και έβρισκε σκουπίδια.

 

 

PS. Για όλα φταίει η C!!!

 

Δημοσ.

Χαίρομαι που το έλυσες. Λογικό να ήταν το πρώτο που είπε ο defacer :)

 

Όχι βέβαια ότι τα προγράμματα δεν έχουν bugs αλλά αν δεν ήταν κάποιο obscure bug που γινόταν triggered μόνο σε windows και ξέφυγε, θα ήταν δύσκολο να είναι χαλασμένο το select γιατί η freetype χρησιμοποιείται για rendering από τα πάντα σε linux / bsd και η sdl είναι η πιο ευρέως χρησιμοποιούμενη βιβλιοθήκη γραφικών είτε μιλάμε για games, για εξομοιωτές όπως qemu, virtualbox, κτλ γενικά από τα πάντα που θέλουν "εύκολα" γραφικά. Με αυτό το σκεπτικό δέχονται πάρα πολύ testing και είναι δύσκολο να έχουν κάποιο τόσο απλό bug (χωρίς φυσικά να λέει κάτι αυτό).

 

OT: Καλή χρονιά να έχουμε.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...