Heisenbug

Από τη Βικιπαίδεια, την ελεύθερη εγκυκλοπαίδεια
Πήδηση στην πλοήγηση Πήδηση στην αναζήτηση
Για τη διανομή Linux Heisenbug, δείτε Fedora.

Ο όρος Heisenbug είναι όρος της «αργκό» του κλάδου της Πληροφορικής και χρησιμοποιείται για τον προσδιορισμό της ύπαρξης ενός σφάλματος λογισμικού που φαίνεται να εξαφανίζεται ή να τροποποιεί τη συμπεριφορά του όταν κάποιος προσπαθεί να το εντοπίσει.[1] Ο όρος είναι ένα λογοπαίγνιο τον όρο «bug» (σφάλμα) και το όνομα του Βέρνερ Χάιζενμπεργκ, του φυσικού που υποστήριξε για πρώτη φορά στην κβαντομηχανική, την επίδραση του παρατηρητή, δηλώνοντας ότι η παρατήρηση ενός συστήματος αναπόφευκτα μεταβάλλει την κατάσταση του.

Παρόμοιοι όροι, όπως «bohrbug», «mandelbug»,[2][3][4] και «schrödinbug»[5][6] έχουν κατά καιρούς χρησιμοποιηθεί για άλλα είδη ασυνήθιστων σφαλμάτων λογισμικού[7][8]. Ωστόσο, σε αντίθεση με το «heisenbug», οι υπόλοιποι όροι δεν είναι ευρέως γνωστοί.

Παραδείγματα[Επεξεργασία | επεξεργασία κώδικα]

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

Κοινό παράδειγμα ενός σφάλματος «heisenbug» είναι το σφάλμα που εμφανίζεται όταν το πρόγραμμα μεταγλωττιστεί με έναν μεταγλωττιστή βελτιστοποίησης (ή με παραμέτρους βελτιστοποίησης), αλλά όχι όταν το ίδιο πρόγραμμα μεταγλωττίζεται χωρίς βελτιστοποίηση (όπως γίνεται συχνά κατά την αποσφαλμάτωση). Η διαδικασία αποσφαλμάτωσης, εκτιμά ότι ένα βελτιστοποιημένο πρόγραμμα θα κρατήσει κανονικά κάποιες τιμές στους τους καταχωρητές του επεξεργαστή, αλλά συχνά αυτοί ωθούνται στην κύρια μνήμη. Αυτό μπορεί να επηρεάσει, για παράδειγμα, το αποτέλεσμα πράξεων ή συγκρίσεων μεταξύ αριθμών κινητής υποδιαστολής, καθώς η καταχώρηση της τιμής στη μνήμη μπορεί να έχει μικρότερο εύρος ή ακρίβεια από την τιμή του καταχωρητή. Επίσης, σφάλματα «heisenbug» μπορεί να εμφανιστούν από παρενέργειες σε εκφράσεις ελέγχου που χρησιμοποιήθηκαν κατά τη διάρκεια εκτέλεσης εκφράσεων-δηλώσεων assertions σε γλώσσες όπως η C και η C ++, καθώς η έκφραση ελέγχου δεν εκτελείται όταν οι δηλώσεις της γλώσσας (assertions) απενεργοποιηθούν στον παραχθέντα κώδικα χρησιμοποιώντας τη μακροεντολή NDEBUG .

Άλλες συνηθισμένες αιτίες ύπαρξης σφαλμάτων «heisenbugs» είναι η χρήση μη-αρχικοποιημένων μεταβλητών μέσα στο πρόγραμμα (πρακτική που αλλάζει τη διεύθυνση ή/και την αρχική τιμή κατά τη διάρκεια της αποσφαλμάτωσης), ή η παρακολούθηση δεικτών που μπορεί να δείχνουν σε διαφορετικά σημεία, κατά τη διάρκεια αποσφαλμάτωσης. Oι debuggers συνήθως παρέχουν σημεία διακοπής (breakpoints) ή άλλες διεπαφές χρήστη που προκαλούν εκτέλεση πρόσθετου κώδικα που μπορεί να εκτελεστεί στο παρασκήνιο, και δύναται να αλλάξει την κατάσταση του προγράμματος.

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

Τα σφάλματα «heisenbug» μπορούν να θεωρηθούν αποτέλεσμα της επίδρασης του παρατηρητή στον τομέα της τεχνολογίας πληροφοριών.[9]

Σχετικοί Όροι[Επεξεργασία | επεξεργασία κώδικα]

Το «bohrbug», αντίθετα με το «heisenbug», είναι ένα συνηθισμένο σφάλμα. Όπως και το ντετερμινιστικό ατομικό πρότυπο του Μπορ, βάσει του οποίου τα άτομα δεν αλλάζουν τη συμπεριφορά τους και είναι σχετικά εύκολο να εντοπιστούν.[10][11]

Το «mandelbug» (λογοπαίγνιο με το όνομα του Μπενουά Μάντελμπροτ) είναι ένα σφάλμα του οποίου τα αίτια είναι υπερβολικά, πολύπλοκα που αψηφούν την επισκευή, ή η συμπεριφορά του φαίνεται χαοτική ή ακόμα και μη-ντετερμινιστική.

Το «schrödinbug» (λογοπαίγνιο με το όνομα του Έρβιν Σρέντινγκερ και τη γάτα του) είναι ένα σφάλμα που εκδηλώνεται με τη λειτουργία του λογισμικού αφού ο προγραμματιστής συμπεράνει ότι ο κώδικας θα ήταν αδύνατο να δουλέψει[ασαφές].

Ένα «hindenbug» [12] (λογοπαίγνιο με το όνομα του Hindenburg disaster) είναι ένα σφάλμα με καταστροφική συμπεριφορά.

Ιστορία του όρου[Επεξεργασία | επεξεργασία κώδικα]

Ο όρος χρησιμοποιήθηκε πρώτη φορά από τον Jim Gray, σε μια επιστημονική δημοσίευση πάνω στις βλάβες λογισμικού[13] καθώς επίσης το 1986 από τους Jonathan Clark και Zhahai Stewart στην mailing list (later Usenet news group) comp.risks.[14]

Ο Bruce Lindsay, ερευνητής της IBM, επιβεβαίωσε σε μια συνέντευξη το 2004 ACM Queue ότι ήταν παρών όταν ο όρος «heisenbug» ορίστηκε αρχικά.[15]

Μια προγενέστερη αναφορά του έγινε στο ACM το 1983.[16]

Παραπομπές[Επεξεργασία | επεξεργασία κώδικα]

  1. «The Jargon File: heisenbug». http://catb.org/jargon/html/H/heisenbug.html. 
  2. «The Jargon File: Mandelbug». Catb.org. http://catb.org/jargon/html/M/mandelbug.html. Ανακτήθηκε στις 2013-09-05. 
  3. Raymond, Eric S.; The New Hacker's Dictionary, 3rd edition, 1996
  4. Clarke, Arthur C., The Ghost from the Grand Banks, Bantam Books, 1990
  5. «The Jargon File: Schroedinbug». Catb.org. http://www.catb.org/jargon/html/S/schroedinbug.html. Ανακτήθηκε στις 2013-09-05. 
  6. Raymond, Eric S.; The New Hacker's Dictionary, 3rd edition, 1996
  7. The following article investigates the various definitions of bohrbug, mandelbug and heisenbug proposed in the literature, as well as the statements made about the relationships between these fault types: Grottke, Michael; and Trivedi, Kishor S.; Software Faults, Software Aging and Software Rejuvenation, Journal of the Reliability Engineering Association of Japan, Vol. 27, No. 7, pp. 425-438, 2005.
  8. Grottke, Michael; and Trivedi, Kishor S.; Fighting Bugs: Remove, Retry, Replicate, and Rejuvenate, IEEE Computer vol. 40, no. 2 (February 2007), pp. 107-109
  9. CATB.org, "phase of the moon"
  10. Goshgarian, Gary; Exploring Language, HarperCollins College Publishers, 1995
  11. "Such transient software failures have been given the whimsical name “Heisenbug” because they disappear when reexamined. By contrast, “Bohrbugs” are good solid bugs." (IEEE Computer Group News, Volume 24, Numbers 7–12, 1991)
  12. «Hinden Bug». http://c2.com/cgi/wiki?HindenBug. 
  13. Gray, Jim (1985). «Why Do Computers Stop And What Can Be Done About It?». Technical Report 85.7. Tandem Computers. http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.59.6561. 
  14. (16 December 1986) RISKS DIGEST 4.30 - (23 December 1986) RISKS DIGEST 4.34, moderated by Peter G. Neumann
  15. «"A Conversation with Bruce Lindsay", ACM Queue vol. 2, no. 8 - November 2004». Queue.acm.org. http://queue.acm.org/detail.cfm?id=1036486. Ανακτήθηκε στις 2013-09-05. 
  16. Proceedings of the ACM SIGSOFT/SIGPLAN Software Engineering Symposium on High-Level Debugging, Pacific Grove, California, March 20–23, 1983, Association for Computing Machinery, 1983, Google Books search:
    This is the Heisenberg Uncertainty Principle as applied to debugging (an instance of such a bug was called a "Heisenbug" by one participant.)


    Also cited in LeBlanc, Richard J.; Robbins, Arnold D.; Event-Driven Monitoring of Distributed Programs, in Proceedings of the IEEE 5th International Conference on Distributed Computing Systems (ICDCS), IEEE Computer Society, Computer Society Press, 1985, pp. 515-522 Google Books search:

    This the Heisenberg Uncertainty Principle as applied to Debugging, sometimes called the "Heisenbug" Principle [ACM83].


Εξωτερικοί Σύνδεσμοι[Επεξεργασία | επεξεργασία κώδικα]