Μετάβαση στο κύριο περιεχόμενο

Πώς Delta debugging μετατρέπει ένα σπασμένο save σε μια ελάχιστη περίπτωση παλινδρόμησης

Αρχικό διάγραμμα μείωσης αντιπαράδειγμα Persistium που δείχνει μια μεγάλη σπασμένη κατάσταση που περιορίζεται σε μια μικρή αναπαραγώγιμη διάταξη παλινδρόμησης.

Μια πρακτική μέθοδος για τη συρρίκνωση μιας αναπαραγώγιμης σπασμένης ακολουθίας αποθήκευσης ή δράσης σε μια μικρή, αναθεωρήσιμη διάταξη παλινδρόμησης χωρίς να χαθεί η παραβιασμένη αμετάβλητη.

Μια μεγάλη σπασμένη διάσωση είναι απόδειξη, όχι εξήγηση.

Όταν μια αποθήκευση αποτυγχάνει να φορτώσει, μια αναζήτηση εξαφανίζεται, ή μια μετανάστευση παραβιάζει έναν κανόνα παιχνιδιού, το πρώτο τεχνούργημα μπορεί να είναι τεράστιο: εκατοντάδες πεδία, φωλιασμένο συλλογές, μια μακρά ιστορία δράσης, ένα στιγμιότυπο περιεχομένου, και ένα περιβάλλον που δεν υπάρχει πλέον. Αυτό το τεχνούργημα είναι πολύτιμο επειδή αναπαράγει το πρόβλημα. Είναι δύσκολο επειδή δίνει σε έναν προγραμματιστή πολύ περισσότερες πληροφορίες από ό, τι μπορούν να σκεφτούν ταυτόχρονα.

Η αποσφαλμάτωση Delta αλλάζει τον στόχο. Αντί να ζητήσει από ένα άτομο να εντοπίσει τη μία σχετική αξία, ask ένα ντετερμινιστικό πρόσχημα αν ένας υποψήφιος εξακολουθεί να αποδεικνύει την αποτυχία. Στη συνέχεια, αφαιρέστε ή απλοποιήστε μέρη του κράτους, ενώ το κατηγορηματικό παραμένει αληθινό. Το τελικό αποτέλεσμα είναι μια ελάχιστη περίπτωση παλινδρόμησης: αρκετά μικρή για να επανεξετάσει, αρκετά σταθερή για να αναπαραχθεί, και σαφής για το αμετάβλητο που παραμένει χαλασμένο.

Ένας μειωτής μπορεί να σταματήσει όταν καμία ολόκληρη ομάδα δεν μπορεί να αφαιρεθεί, όταν ένας προϋπολογισμός εκτέλεσης είναι εξαντλημένος, ή όταν η ιδιοσυγκρασία είναι αρκετά κατανοητή ώστε να γίνει μια δοκιμή παλινδρόμησης. Η διατηρημένη ιδιοκτησία μετράει περισσότερο από μια αφηρημένη βέλτιστη.

Καθιέρωση αναπαραγωγιμότητας πριν από τη μείωση

Η μείωση λειτουργεί μόνο όταν η αποτυχία είναι επαναλαμβανόμενη. Πρώτα συλλαμβάνετε το ακριβές προκαθορισμό: ο τρέχων φορτωτής ρίχνει ένα διαβαθμισμένο σφάλμα, κάνει μια αναλλοίωτη επιστροφή ψευδή, μήπως μια προκύπτουσα κατάσταση διαφέρει σημασιολογικά από το αναμενόμενο αποτέλεσμα, ή μήπως μια ακολουθία δράσης παράγει μια άκυρη επιχορήγηση; Αποφύγετε τη χρήση ενός αόριστου προκαθορισμού όπως “το παιχνίδι φαίνεται λάθος”. Το προκαθορισμένο πρέπει να επιστρέψει την ίδια απάντηση για τις ίδιες εισροές, ή ο μειωτής θα κυνηγήσει το θόρυβο.

Καταγράψτε το περιβάλλον παράλληλα με τον υποψήφιο: κατασκευή ή δέσμευση εφαρμογών, έκδοση μετάβασης, έκδοση προσαρμογέα, περιεχόμενο και στιγμιότυπο διαμόρφωσης, ντετερμινιστικό σπόρο, υποθέσεις πλατφόρμας, και έναρξη fixture hash. Αν ένα ζωντανό ρολόι, τυχαία πηγή, απομακρυσμένη διαμόρφωση ανάκτηση, ή εργάτης φόντου μπορεί να αλλάξει το αποτέλεσμα, να το αντικαταστήσει με ένα ντετερμινιστικό όριο δοκιμής ή να το καταγράψει ως σαφή περιορισμό. Ο μειωτής δεν πρέπει να δοκιμάσει μυστικά ένα νέο περιβάλλον σε κάθε προσπάθεια.

Μια τελική κατάσταση μπορεί να αποκρύψει τη λειτουργία που την παρήγαγε. Μια αλληλουχία fixture μπορεί να εκφράσει «ξεκινήστε από αυτό το προφίλ, εκτελέστε αυτά τα επτά αιτήματα, τότε το αμετάβλητο αποτυγχάνει.» Αυτός ο διαχωρισμός επιτρέπει στον μειωτή να συρρικνώσει τα πεδία, τις συλλογές και τις ενέργειες χωρίς να συγχέει ένα είδος στοιχείων για ένα άλλο.

Μείωση πεδίων και συλλογών σε κατατμήσεις

Ξεκινήστε με χονδροειδείς κατατμήσεις. Χωρίστε το ανώτερο επίπεδο αποθηκεύστε σε ομάδες πεδίου, αφαιρέστε μια ομάδα από ένα αντίγραφο εργασίας και εκτελέστε το προκαθορισμένο. Αν η αποτυχία επιμένει, κρατήστε την αφαίρεση. Αν εξαφανιστεί, επαναφέρετε την ομάδα και υποδιαιρέστε την. Αυτό είναι πιο αποτελεσματικό από τη διαγραφή ενός πεδίου κάθε φορά από ένα μεγάλο αντικείμενο. Συνεχίστε σε φωλισμένα αρχεία και συλλογές μόλις εντοπιστεί μια σχετική περιοχή.

Οι συλλογές χρειάζονται ειδική φροντίδα. Στοιχεία απογραφής, αρχεία αναζήτησης, μετρητές και ιστορικό γεγονότων μπορεί να αναφέρονται το ένα στο άλλο. Η αφαίρεση μιας καταχώρησης μπορεί να αλλάξει ευρετήρια λίστας, κανόνες χωρητικότητας, ή συγκεντρωτικά υπόλοιπα. Κανονικοποίηση της παραγγελίας όταν η σειρά δεν έχει νόημα, διατήρηση σταθερών αναγνωριστικών όπου οι αναφορές τα απαιτούν, και να δηλώσει αν ένα χαμένο στοιχείο θα πρέπει να απουσιάζει, να ακυρώνεται, ή να αντιπροσωπεύεται από μια ρητή παρακαταθήκη. Ένας μειωτής δεν θα πρέπει να μετατρέψει ένα πραγματικό ελάττωμα μετανάστευσης σε σφάλμα αναλυτή που προκαλείται από λανθασμένη εισαγωγή δοκιμών.

Χρησιμοποιήστε τη συρρίκνωση της αξίας μετά τη δομική μείωση. Μετακίνηση ακέραιοι προς το μηδέν ή ένα σημαντικό όριο, συντομεύουν συμβολοσειρές, να αντικαταστήσει ένα μακρύ αναγνωριστικό με ένα ασφαλές αναγνωριστικό δοκιμής, και να μειώσει χρονοσφραγίδες σε μια σταθερή εποχή μόνο όταν η ακριβής τους τιμή δεν είναι η υπό δοκιμή κατάσταση. Κάθε απλοποίηση πρέπει να κρατήσει το προκαθορισμένο αληθές. Αυτό συχνά αποκαλύπτει ότι ένα προφανές σύνθετο σφάλμα προφίλ είναι πραγματικά “ένα συνταξιούχο ID στοιχείο συν μια πλήρη απογραφή” ή “ένα αρνητικό μετρητή μετά από μια παραλείψει έκδοση.”

Η αρχική οπτική κατάσταση συρρίκνωσης δείχνει ένα σπασμένο save partited, απλοποιημένο, replayed, και διατηρείται ως μια ελάχιστη διάταξη παλινδρόμησης.
Η μείωση εναλλάσσεται μεταξύ ελεγχόμενης απομάκρυνσης και ντετερμινιστικής επανάληψης μέχρι η σημαντική αποτυχία να παραμείνει σε μικρότερη κατάσταση.

Μειώστε τις ακολουθίες ενεργειών χωρίς να αλλάξετε τη σημασία τους

Μερικές αποτυχίες εμφανίζονται μόνο μετά το χρόνο: μια επανέναρξη αγοράς μετά από μια επανασύνδεση, μια αποθήκευση μετά από μια ενημέρωση ρύθμισης, ή μια μετάβαση μετά από ένα διακοπτόμενο φροντιστήριο. Εφαρμόστε την ίδια ιδέα κατατμήσεων στις ενέργειες. Αφαιρέστε ένα συνεχές ήμισυ της ακολουθίας, επανάληψη, και να κρατήσει την αφαίρεση αν το αμετάβλητο εξακολουθεί να αποτυγχάνει. Στη συνέχεια, subdivide. Διατηρήστε τις απαιτούμενες ενέργειες ρύθμισης, αλλά αμφισβητήστε τυχαία πλοήγηση, επαναλαμβανόμενες αναγνώσεις, και άσχετες μεταλλάξεις.

Οι ενέργειες θα πρέπει να έχουν σταθερές παραμέτρους και προσδοκίες αποτελεσμάτων. Ένας μειωτής που αντικαθιστά κάθε αίτημα με ένα νέο αναγνωριστικό τυχαίας συναλλαγής δεν δοκιμάζει πλέον την αρχική σημασιολογία επανέναρξης. Ένας μειωτής που αφαιρεί το αρχικό φορτίο-σημαία χαρακτηριστικό μπορεί να αλλάξει το πλαίσιο διαμόρφωσης. Καταγράψτε την ταυτότητα δράσης, τις σχετικές εισόδους, την αξιόπιστη έναντι μη αξιόπιστης πηγής, και το σημείο στο οποίο ελέγχεται η αναλλοίωτη. Αυτό καθιστά την τελική ακολουθία χρήσιμη τόσο στους προγραμματιστές όσο και στην QA.

Όταν μια ακολουθία εξαρτάται από τη συνέπεια, επιλέξτε ένα ντετερμινιστικό πρόγραμμα. Καταγράψτε τη σειρά με την οποία οι εργαζόμενοι ή οι προσομοιωμένοι πελάτες φτάνουν σε κρίσιμα όρια. Αν η αποτυχία συμβαίνει μόνο κάτω από έναν αγώνα, μια δοκιμή μπορεί να χρειαστεί ένα ελεγχόμενο φραγμό αντί χρονικές-εξαρτώμενες κλήσεις ύπνου.

Διατηρήστε το παραβιασμένο αμετάβλητο στο τελικό τεχνούργημα.

Ένα μικρό fixture χωρίς ισχυρισμό γίνεται ένα άλλο μυστηριώδες αρχείο. Αποθηκεύστε το παραβιασμένο αμετάβλητο δίπλα στο fixture με σαφείς όρους: διπλό δικαίωμα για μια ταυτότητα συναλλαγής, άγνωστη αναφορά καταλόγου μετά τη μετανάστευση, αρνητικό νόμισμα, απρόσιτη ολοκληρωμένη αναζήτηση, ή σημασιολογική αναντιστοιχία μετά από ένα ταξίδι γύρου. Συμπεριλάβετε την αναμενόμενη ταξινόμηση και την παρατηρούμενη. Η fixture θα πρέπει να αποτύχει για κάποιο λόγο, όχι μόνο επειδή μια συνάρτηση επιστρέφει ψευδή.

Συγκρίνετε πριν και μετά την κατάσταση σημασιολογικά. Ένα ακατέργαστο diff μπορεί να περιέχει επαναγραμμένες χρονοσφραγίδες, αναδιάτακτες συστοιχίες, παραγόμενες ταυτότητες, ή μορφοποίηση σειράς. Ένα σημασιολογικό diff τονίζει τις τιμές που επηρεάζουν το αμετάβλητο. Μπορεί να αναφέρει ότι ένα στοιχείο άλλαξε από μια έγκυρη κληρονομιά fallback σε ένα άγνωστο ID, ή ότι μια ισορροπία αυξήθηκε δύο φορές για το ίδιο κλειδί καθολικός. Κρατήστε το normalizer στενό και τεκμηριωμένο; ένας ευρύς κανονικοποιητής μπορεί να διαγράψει το ίδιο το ελάττωμα ο μειωτής έχει σκοπό να διατηρήσει.

Γράψτε ένα δηλωτικό επανάληψης με τη διαδρομή στερέωσης, το χασίς πηγής, το μειωμένο χασίς, το αποτύπωμα περιβάλλοντος, τους ντετερμινιστικούς σπόρους, την ακολουθία δράσης αν υπάρχει, το προκαθορισμένο όνομα, και το αναμενόμενο αποτέλεσμα. Αυτό το δηλωτικό επιτρέπει σε ένα άλλο άτομο να επανεκκινήσει την υπόθεση χωρίς πρόσβαση στην αρχική υπερμεγέθη κατάσταση.

Μάθετε πότε η μείωση θα πρέπει να σταματήσει

Ορισμένες μεταναστεύσεις είναι αργές, μερικά σενάρια χρειάζονται προσαρμογείς υπηρεσιών, κάποιες συνθήκες αποτυχίας είναι αμυδρές μέχρι να καθοριστεί ένα περιβάλλον. Ορίστε προϋπολογισμούς για προσπάθειες, χρόνο τοίχων και μέτρηση τεχνουργημάτων. Σταματήστε όταν η διάταξη είναι αρκετά μικρή για να εξηγήσετε το θέμα, όταν δεν μπορεί να αφαιρεθεί κανένα χώρισμα χωρίς να χάσει την αποτυχία, ή όταν το υπόλοιπο έργο απαιτεί κρίση τομέα και όχι μηχανική συρρίκνωση.

Η μείωση έχει όρια. Δεν μπορεί να αποφασίσει εάν ένα κληροδοτημένο στοιχείο θα πρέπει να χαρτογραφήσει σε μια αντικατάσταση, αν μια απόστρατη αναζήτηση χρειάζεται αποζημίωση, ή αν μια αποθηκευμένη αξία είναι νόμιμη σε μια επανασχεδιασμένη οικονομία. Αυτές είναι αποφάσεις προϊόντων. Επίσης, δεν μπορεί να μειώσει με ασφάλεια κρυπτογραφημένα ή ευαίσθητα δεδομένα αντιγράφοντάς το σε ευρεία εργαλειοθήκη.

Μην δημοσιεύετε μια κατάσταση ακατέργαστου παίκτη ως μια λύση παλινδρόμησης. Τα ονόματα, τα στοιχεία επικοινωνίας, τα στοιχεία παραλαβής, τα αναγνωριστικά συσκευών, την πρόσβαση σε μάρκες, και οποιοδήποτε πεδίο δεν χρειάζεται για το προκαθορισμό. Ένα ελάχιστο fixture είναι μια ευκαιρία για τη βελτίωση της ιδιωτικής ζωής, καθώς και τη δυνατότητα διάγνωσης. Το τελικό τεχνούργημα θα πρέπει να είναι ασφαλές να συμπεριλάβει στο test corpus του έργου και αρκετά χρήσιμο για να αποτρέψει την επανάληψη.

Πρακτικός κατάλογος ελέγχου

  • Καθορίστε μια ντετερμινιστική αποτυχία προκαθοριστεί πριν αφαιρέσετε οποιαδήποτε κατάσταση.
  • Καταγράψτε την εφαρμογή, τον προσαρμογέα, το περιεχόμενο, τη διαμόρφωση, τους σπόρους και το περιβάλλον στερέωσης.
  • Διατήρηση αρχικής κατάστασης και ακολουθίας δράσης χωριστά όταν η συμπεριφορά εκτυλίσσεται με την πάροδο του χρόνου.
  • Μειώστε πρώτα ομάδες ανώτατου επιπέδου, στη συνέχεια φωλιάζει πεδία, συλλογές, και τις αξίες.
  • Διατηρεί αναφορές και δομική εγκυρότητα, ενώ προκαλεί σημασιολογική συνάφεια.
  • Χρησιμοποιήστε ένα πρόγραμμα ελεγχόμενης σύμπτωσης αντί για διορθώσεις εξαρτώμενες από το χρόνο.
  • Αποθήκευση της παραβιασμένης αμετάβλητης, αναμενόμενης ταξινόμησης, σημασιολογικής διαφοράς, και replay δηλωτικό με το αποτέλεσμα.
  • Σταματήστε σε ένα χρήσιμο οριοθετημένο αντιπαράδειγμα? μην βελτιστοποιήσετε επ 'αόριστον για θεωρητική μινιμαλότητα.
  • Ακτινοβολήστε ή συνθέστε ευαίσθητα δεδομένα πριν από την εισαγωγή ενός fixture σε συνήθεις δοκιμές.

Συχνές ερωτήσεις

Το δέλτα αποσφαλματώνεται μόνο για ατυχήματα;

Όχι. Το κατηγορητήριο μπορεί να είναι μια συντριβή, αλλά μπορεί επίσης να είναι ένα παραβιασμένο παιχνίδι αμετάβλητο, ένα λάθος αριθμό δικαιωμάτων, ένα αποτυχημένο ταξίδι επιστροφής αποθήκευσης φορτίου, μια απόρριψη ταξινόμηση μετανάστευσης, ή μια αναντιστοιχία μεταξύ αναμενόμενης και παρατηρούμενης κατάστασης. Είναι πιο χρήσιμο κάθε φορά που μια σύνθετη είσοδος παράγει αξιόπιστα ένα αποτέλεσμα που δεν πρέπει να συμβεί.

Κι αν η αποτυχία είναι διαλείπουσα;

Πρώτα μειώστε τον μη-καθορισμό. Καθορίστε τους σπόρους, συλλαμβάνετε τη διαμόρφωση, απομονώστε το χρόνο και τα όρια του δικτύου, και ελέγξτε το concurrency. Αν το αποτέλεσμα παραμένει probabilistic, χρησιμοποιήστε ένα όριο που βασίζεται μόνο με προσοχή και καταγράψτε αυτό τον περιορισμό. Ένα σταθερό μικρότερο σενάριο είναι συνήθως πιο πολύτιμο από ένα μεγάλο flaky fixture.

Μπορεί ένας μειωτής να τρέξει ενάντια στα δεδομένα παραγωγής;

Μια περιορισμένη έρευνα συμβάντων μπορεί να χρειαστεί προστατευμένα αποδεικτικά στοιχεία, αλλά αυτό είναι μια ξεχωριστή επιχειρησιακή διαδικασία με τους ελέγχους πρόσβασης, τους κανόνες διατήρησης και αναθεώρησης. Μην κάνετε τη σουίτα παλινδρόμησης αντίγραφο των δεδομένων του παίκτη.

Τι ισχυρίζεται εδώ το Persistium;

Persistium Το σημείωμα αυτό παρουσιάζει μια γενικά χρήσιμη μείωση της ροής εργασίας και δεν ισχυρίζεται ότι ένα δημόσιο προϊόν αυτόματα εντοπίζει αυθαίρετες εξοικονομήσεις, έχει παρατηρήσει αποτυχίες των πελατών, ή λειτουργεί μια φιλοξενούμενη υπηρεσία ανάλυσης.

Σχετικό σύστημαΕξερευνήστε το Persistium