هذه هي المادة المرجعية حول Heisenbags. نحن نتحدث عن كيفية ظهورهم وكيفية ارتباطهم بالحواسيب المركزية - منشئو السحابة.
/ الصورة لارس زيمرمان CC BYHeisenbug (Heisenbug أو Heisenbug) هو مصطلح يصف الأخطاء التي تغير الخصائص أثناء تصحيح التعليمات البرمجية. أي أنها تختفي أثناء الاختبار وتصحيح الأخطاء ، ولكنها تظهر في الإنتاج.
يشير اسم "Heisenbag" إلى
مبدأ عدم اليقين في Heisenberg في ميكانيكا الكم. بشكل عام ، يمكن وصفه بأنه تغيير غير متوقع في خصائص الكائن المرصود نتيجة الملاحظة.
القصة
يعتبر مصطلح Heisenbug هو Bruce Lindsay ، موظف في مركز أبحاث IBM. لقد ساهم في تطوير قواعد البيانات العلائقية وشارك في تطوير محرك قاعدة بيانات
شركة IBM System R.في عام 1985 ، أثناء دراسته في جامعة بيركلي ، عمل بروس
وجيم غراي (جيمس نيكولاس جراي) ، وهو عالم أمريكي في نظرية أنظمة الكمبيوتر ، في OS CAL-TSS. تمت كتابته خصيصًا من أجل
التحكم المركزي Processor
6400 ذو المعالجين الرئيسيين [
PDF ، صفحة 3] ، حيث قام الجيش بمعالجة كميات كبيرة من البيانات.
بالطبع ، خلال عملية التطوير كانت هناك أخطاء. لكن العديد منهم كانوا مميزين - بمجرد أن حاول المهندسون إصلاحهم ، اختفوا. في ذلك الوقت ، كانت ليندساي تدرس الفيزياء ومبدأ هايسنبرغ بشكل خاص. فجأة ، بزغ الفجر على ليندساي - أصبح هو وجراي شاهدين على ظاهرة مماثلة: اختفت الأخطاء ، لأن الملاحظة أثرت على خصائص الكائن. من هنا جاء اسم "heisenbag".
روى ليندساي هذه القصة
في مقابلة مع ممثلي
جمعية هندسة الحاسبات (ACM) في عام 2003.
أمثلة Heisenbug
شارك المستخدمون على الشبكة وعلى الأنظمة الأساسية المواضيعية مثل Stack Overflow بعض الأمثلة على أكياس الهيسين التي قابلوها في مشاريعهم. حاول أحد سكان SO حساب مساحة الشكل بين منحنيين بدقة ثلاثة منازل عشرية. لتصحيح الخوارزمية في C ++ ، أضاف السطر:
cout << current << endl;
ولكن بمجرد أن علق عليها ، توقف الكود عن العمل وحلقه. كان البرنامج
على النحو التالي :
#include <iostream> #include <cmath> using namespace std; double up = 19.0 + (61.0/125.0); double down = -32.0 - (2.0/3.0); double rectangle = (up - down) * 8.0; double f(double x) { return (pow(x, 4.0)/500.0) - (pow(x, 2.0)/200.0) - 0.012; } double g(double x) { return -(pow(x, 3.0)/30.0) + (x/20.0) + (1.0/6.0); } double area_upper(double x, double step) { return (((up - f(x)) + (up - f(x + step))) * step) / 2.0; } double area_lower(double x, double step) { return (((g(x) - down) + (g(x + step) - down)) * step) / 2.0; } double area(double x, double step) { return area_upper(x, step) + area_lower(x, step); } int main() { double current = 0, last = 0, step = 1.0; do { last = current; step /= 10.0; current = 0; for(double x = 2.0; x < 10.0; x += step) current += area(x, step); current = rectangle - current; current = round(current * 1000.0) / 1000.0; //cout << current << endl; //<-- COMMENT BACK IN TO "FIX" BUG } while(current != last); cout << current << endl; return 0; }
جوهر heisenbug : عند عدم وجود
نسخة مطبوعة ، ينفذ البرنامج مقارنات بدقة عالية في سجلات المعالج. علاوة على ذلك ، دقة النتيجة تتجاوز قدرات مضاعفة. لإخراج القيمة ، يقوم المحول البرمجي بإرجاع نتيجة الحسابات إلى الذاكرة الرئيسية - بينما يتم تجاهل الجزء الكسري. والمقارنة اللاحقة في حين يؤدي إلى النتيجة الصحيحة. عند تعليق الخط ، لا يوجد اقتطاع ضمني للجزء الكسري. لهذا السبب ، فإن القيمتين في حين تتضح دائمًا أنها غير متكافئة مع بعضها البعض. كحل للمشكلة ، اقترح أحد المشاركين في المناقشة استخدام مقارنة تقريبية لأرقام الفاصلة العائمة.
تمت مشاركة قصة أخرى حول heisenbug من
قبل المهندسين الذين يعملون مع بيئة لغة
Smalltalk-80 على Unix. لاحظوا أن النظام قد تعطل إذا تركت الخمول لفترة من الوقت. ولكن بعد تحريك مؤشر الماوس ، عملت كل شيء مرة أخرى كالمعتاد.
كانت المشكلة في Unix scheduler ، والتي خفضت من أولويات المهام الخاملة. في مرحلة ما ، تم تقليل الأولوية بدرجة كبيرة لدرجة أن العمليات في Smalltalk لم يكن لديها وقت لإكمالها. كومة المهمة نمت وعلقت البرنامج. عندما قام المستخدم بنقل المؤشر ، استعاد نظام التشغيل الأولوية وعاد كل شيء إلى المربع الأول.
البق * الأخرى
هناك عدد من المصطلحات التي تصف جميع أنواع الأخطاء: Borbag ، Mandelbug ، Schrödinbag.
Borbag ، عكس Heisenbug ، هو خطأ شائع يسهل العثور عليه وإصلاحه. سميت باسم نيلز بور ، الذي اقترح في عام 1913 نموذجًا بسيطًا ومفهومًا لهيكل الذرة. وفقًا لهذا النموذج ، تتحرك إلكترونات الذرة في مدارات معينة ، مما يعني أنه يمكن التنبؤ بزخمها ونصف قطر حركتها. وبالمثل ، يمكن التنبؤ بظهور Borbags إذا تم إنشاء الشروط اللازمة لهم.
/ photo OLCF at ORNL CC BYSchroedinbag هو خطأ موجود ولا وجود له في نفس الوقت ، حتى ينظر المطور إليه. تم تسمية الخطأ على شرف
تجربة فكرية شهيرة.
بالنسبة إلى
Mandelbug ، فهذا خطأ بسبب تصرف النظام بطريقة متقطعة وغير متوقعة. سميت هذه الظاهرة باسم عالم الفيزياء والرياضيات ومبدع الهندسة
الكسورية بينوا ماندلبروت .
ما هي النتيجة
هناك
العديد من الأمثلة على Heisenbags (وغيرها من الأخطاء). يصعب العثور عليها ، لكن الأسباب عادة ما تكون شائعة: متغير غير مهيأ ، أخطاء التزامن في بيئة متعددة الخيوط ، أو مشاكل في خوارزميات
إزالة الكود الميت . اتضح أنه من أجل التعامل مع مثل هذه الأخطاء ، يجب قطعها حتى في مرحلة تصميم التطبيق.
من مدونة IaaS للشركات: