Heisenbug

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

Παρόμοιοι όροι, όπως «bohrbug», «mandelbug»,Raymond, Eric S.; The New Hacker's Dictionary, 3rd edition, 1996Clarke, Arthur C., The Ghost from the Grand Banks, Bantam Books, 1990 και «schrödinbug»Raymond, Eric S.; The New Hacker's Dictionary, 3rd edition, 1996 έχουν κατά καιρούς χρησιμοποιηθεί για άλλα είδη ασυνήθιστων σφαλμάτων λογισμικού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.Grottke, Michael; and Trivedi, Kishor S.; Fighting Bugs: Remove, Retry, Replicate, and Rejuvenate, IEEE Computer vol. 40, no. 2 (February 2007), pp. 107-109. 
Ωστόσο, σε αντίθεση με το «heisenbug», οι υπόλοιποι όροι δεν είναι ευρέως γνωστοί.

Παραδείγματα

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

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

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

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

Τα σφάλματα «heisenbug» μπορούν να θεωρηθούν αποτέλεσμα της επίδρασης του παρατηρητή στον τομέα της τεχνολογίας πληροφοριών.CATB.org, "phase of the moon"

 Σχετικοί Όροι 
Το «bohrbug», αντίθετα με το «heisenbug», είναι ένα συνηθισμένο σφάλμα. Όπως και το ντετερμινιστικό ατομικό πρότυπο του Μπορ, βάσει του οποίου τα άτομα δεν αλλάζουν τη συμπεριφορά τους και είναι σχετικά εύκολο να εντοπιστούν.Goshgarian, Gary; Exploring Language, HarperCollins College Publishers, 1995"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)

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

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

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

Ιστορία του όρου
Ο όρος χρησιμοποιήθηκε πρώτη φορά από τον Jim Gray, σε μια επιστημονική δημοσίευση πάνω στις βλάβες λογισμικού καθώς επίσης το 1986 από τους Jonathan Clark και Zhahai Stewart στην mailing list (later Usenet news group) comp.risks.(16 December 1986) RISKS DIGEST 4.30 - (23 December 1986) RISKS DIGEST 4.34, moderated by Peter G. Neumann

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

Μια προγενέστερη αναφορά του έγινε στο ACM το 1983.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:

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:

Παραπομπές

Εξωτερικοί Σύνδεσμοι
 Γκρέις Μάρει Χόπερ, η δημιουργός του όρου "bug"
 The Heisenberg Debugging Technology
 A Story About Magic

Κατηγορία:Προγραμματισμός
Κατηγορία:Μηχανική λογισμικού