
Σενάριο
-------


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


Πρόβλημα
--------


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


Ερώτηση
-------


Πώς θα πάτε για την επαλήθευση της αλλαγής σας;


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

 
Πώς μπορείτε να προσεγγίσετε διαλείπουσα σφάλματα;
==================================================



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


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


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

 

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


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


Για παράδειγμα, στα Windows, να πάρετε τον κωδικό σας για να δημιουργήσετε ένα αρχείο minidump (core dump στο Unix), όταν αντιμετωπίζει αυτό το πρόβλημα. Στη συνέχεια μπορείτε να πάρετε τον πελάτη (ή WinQual, στα Windows) για να σας στείλουμε αυτό το αρχείο. Αυτό θα σας δώσει περισσότερες πληροφορίες σχετικά με το πώς κωδικό σας πάει στραβά στο σύστημα παραγωγής.


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


Ακόμη και με όλες αυτές τις πληροφορίες, μπορείτε να καταλήξετε καθορισμό ενός bug που μοιάζει, αλλά δεν είναι, αυτό που ο πελάτης βλέπει.

 

Μπορώ να χρησιμοποιήσω αυτό που ονομάζουμε **«βαρύ ύφος αμυντικό προγραμματισμό»** : **προσθέστε υποστηρίζει** σε όλες τις μονάδες που φαίνεται να συνδέονται με το πρόβλημα. Αυτό που εννοώ είναι, **προσθέσετε πολλά ισχυρίζεται** , υποστηρίζει μαρτυρίες, διεκδικούν κατάσταση των αντικειμένων σε όλες memebers τους, διεκδικούν «Environnement» κατάσταση, κ.λπ.


Επιβεβαιώνει σας βοηθήσει να εντοπίσετε τον κώδικα που δεν συνδέεται με το πρόβλημα.


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

 

Μέσο η κατασκευή με πιο εκτεταμένη (ενδεχομένως προαιρετικό) καταγραφή και αποθήκευση δεδομένων που επιτρέπει την ακριβή αναπαραγωγή της μεταβλητής UI βήματα οι χρήστες πήρε πριν συμβεί το ατύχημα.


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


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

 

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

 

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


Εδώ είναι μερικά επικίνδυνο κώδικα σε c:



```
const int NITER = 1000;
int thread_unsafe_count = 0;
int thread_unsafe_tracker = 0;

void* thread_unsafe_plus(void *a){
  int i, local;
  thread_unsafe_tracker++;
  for (i=0; i<NITER; i++){
    local = thread_unsafe_count;
    local++;
    thread_unsafe_count+=local;
  };
}
void* thread_unsafe_minus(void *a){
  int i, local;
  thread_unsafe_tracker--;
  for (i=0; i<NITER; i++){
    local = thread_unsafe_count;
    local--;
    thread_unsafe_count+=local;
  };
}

```

την οποία μπορώ να δοκιμάσουν (σε enironment pthreads) με:



```
pthread_t th1, th2;
pthread_create(&th1,NULL,&thread_unsafe_plus,NULL);
pthread_create(&th2,NULL,&thread_unsafe_minus,NULL);
pthread_join(th1,NULL);
pthread_join(th2,NULL);
if (thread_unsafe_count != 0) {
  printf("Ah ha!\n");
}

```

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


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

 

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


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

 

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


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


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

 

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


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


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


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

 

Ειδικά το σενάριο
-----------------


Αν και δεν θέλω να επικεντρωθώ μόνο στο θέμα είμαι έχοντας, εδώ είναι μερικές λεπτομέρειες για το τρέχον τεύχος που αντιμετωπίζουμε και πώς το έχω αντιμετωπίσει μέχρι τώρα.


Το ζήτημα παρουσιάζεται όταν ο χρήστης αλληλεπιδρά με τη διεπαφή χρήστη (α TabControl για να είμαστε ακριβείς) σε μια συγκεκριμένη φάση μιας διαδικασίας. Αυτό δεν συμβαίνει πάντοτε και πιστεύω ότι αυτό οφείλεται στο γεγονός ότι το παράθυρο του χρόνου για το πρόβλημα που πρέπει να εκτεθούν είναι μικρή. υποψία μου είναι ότι η προετοιμασία ενός UserControl (είμαστε στη ΝΕΤ, χρησιμοποιώντας C #) συμπίπτει με ένα γεγονός αλλαγή κατάστασης από μια άλλη περιοχή της εφαρμογής, η οποία οδηγεί σε μια γραμματοσειρά που απορρίπτονται. Εν τω μεταξύ, ένα άλλο ελέγχου (α Label) προσπαθεί να επιστήσει την κλωστή με αυτή την γραμματοσειρά, και ως εκ τούτου τη συντριβή.


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


Πλησιάζω
--------


Η προσέγγισή μου ήταν η πρώτη για να εξετάσει το ίχνος στοίβας από αναφορές σφαλμάτων μας και να εξετάσει τον κώδικα της Microsoft με τη χρήση ανακλαστήρα. Δυστυχώς, αυτό οδήγησε σε GDI + call με ελάχιστη τεκμηρίωση, η οποία επιστρέφει μόνο έναν αριθμό για το λάθος - ΝΕΤ μετατρέπει αυτό σε ένα αρκετά άχρηστο μήνυμα που δηλώνει κάτι δεν είναι έγκυρο. Μεγάλος.


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


Από εκεί, κοίταξα κάθε πτυχή της πρόσκλησης χρώμα που συντρίβεται (Κορδόνι) για να δούμε τι θα μπορούσε να είναι άκυρη και άρχισε να αποκλείσει κάθε μία από έως ότου έπεσε στις είδη μιας χρήσης. Στη συνέχεια προσδιορίζεται ποια είχαμε τον έλεγχο και η γραμματοσειρά ήταν ο μόνος. Έτσι, πήρα μια ματιά στο πώς χειρίστηκε τη γραμματοσειρά και κάτω από ποιες συνθήκες μπορούμε να διατεθούν για τον εντοπισμό τυχόν βαθύτερες αιτίες. Ήμουν σε θέση να καταλήξει σε ένα εύλογο αλληλουχία των γεγονότων που ταιριάζουν με τις εκθέσεις από τους χρήστες, και ως εκ τούτου είναι σε θέση να κωδικοποιήσει μια μικρή αποτύπωση του κινδύνου.


Φυσικά, πέρασε από το μυαλό μου ότι το σφάλμα ήταν στο πλαίσιο, αλλά μου αρέσει να υποθέσουμε ότι μαντάρα πριν περάσει το φταίξιμο στη Microsoft.


συμπέρασμα
----------


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

 

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


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


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


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


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

 

Μερικές ερωτήσεις που θα μπορούσατε να ρωτήσετε τον εαυτό σας:


* Όταν έκανε αυτό το κομμάτι του κώδικα τελευταία εργασία χωρίς πρόβλημα.
* Τι έχει γίνει, δεδομένου ότι σταμάτησε να λειτουργεί.


Εάν ο κωδικός δεν έχει εργαστεί ποτέ η προσέγγιση θα είναι διαφορετική φυσικά.


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

 

Σε αυτήν την περίπτωση, όπου τίποτα άλλο δεν λειτουργεί, θα εισαγάγει επιπλέον υλοτομία. 


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


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


Ακόμα κι αν δεν φαίνεται τίποτε, θα σας στενεύουν τα πράγματα κάτω. Ένα ή τον άλλο τρόπο, *θα* καταλήξετε με χρήσιμες θεωρίες.

 

Αυτοί οι τύποι σφάλματα είναι πολύ απογοητευτικό. Προεκτείνουν έξω σε διαφορετικά μηχανήματα με διαφορετικά είδη έθιμο υλικού που θα μπορούσε να είναι σε αυτά (όπως και στην εταιρεία μου), και το αγόρι αμάν χρειάζεται για να γίνει ένας εφιάλτης. Έχω σήμερα πολλά σφάλματα, όπως αυτή τη στιγμή στη δουλειά μου.


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


Νομίζω ότι είστε αρκετά δικαίωμα να ασχολείται με την προσέγγιση colleuge σας.

 

**Απλά: να ζητήσει από το χρήστη που το ανέφερε.**


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


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


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


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


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


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

 

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


Πώς να φτάσετε στο σημείο όπου μπορείτε να καταλάβετε το σφάλμα;


Μέσο ο κωδικός (log σαν τρελός). Εργασία με QA σας - είναι καλοί στο να δημιουργήσετε εκ νέου το πρόβλημα, και θα πρέπει να κανονίσετε να έχετε πλήρη dev εργαλείων στη διάθεσή σας για τις μηχανές τους. Χρησιμοποιήστε τα αυτοματοποιημένα εργαλεία για την προετοιμαστεί μνήμη / πόρων. Απλά κοιτάζω τον κώδικα. Δεν υπάρχει εύκολη λύση.

 

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


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

 

Τα προβλήματα αυτά έχουν πάντα έχουν προκληθεί από:


1. Προβλήματα μνήμης
2. Threading Προβλήματα


Για να λυθεί το πρόβλημα, θα πρέπει:


* Μέσο κωδικό σας (Προσθήκη δηλώσεις log)
* Κωδικός κριτική threading
* Κωδικός κριτική κατανομή μνήμης / εύρεση τιμών


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

 