تمرين - تصحيح الأخطاء باستخدام Visual Studio Code

مكتمل

حان الوقت لوضع معرفتك المكتسبة حديثا في تصحيح الأخطاء موضع التنفيذ. إنه يومك الأول في العمل، وقد حان الوقت لوضع مهارات تصحيح أخطاء .NET الخاصة بك موضع العمل عن طريق تصحيح الأخطاء الموجودة في المنتج الرئيسي للشركة، الآلة الحاسبة Fibonacci.

إنشاء نموذج مشروع .NET لتصحيح الأخطاء

لإعداد Visual Studio Code لتصحيح أخطاء .NET، سنحتاج أولاً إلى مشروع .NET. يتضمن Visual Studio Code محطة طرفية متكاملة، مما يجعل إنشاء مشروع جديد أمرًا سهلاً.

  1. في Visual Studio Code، حدد "File">"Open "Folder.

  2. قم بإنشاء مجلد جديد باسم DotNetDebugging في الموقع الذي تختاره. ثم اختر Select Folder.

  3. افتح نافذة الـ terminal المُتضمنة في Visual Studio Code باختيار View>Terminal من القائمة الرئيسية.

  4. في نافذة المحطة الطرفية، انسخ والصق الأمر التالي:

    dotnet new console
    

    يقوم هذا الأمر بإنشاء ملف Program.cs في المجلد الخاص بك مع برنامج "مرحباً بالعالم" الأساسي المكتوب بالفعل. كما يقوم بإنشاء ملف مشروع C# المسمى DotNetDebugging.csproj.

  5. في نافذة الوحدة الطرفية، انسخ الأمر التالي وألصقه لتشغيل برنامج "مرحبًا بالعالم".

    dotnet run
    

    تعرض نافذة الوحدة الطرفية عبارة "!Hello World" كإخراج.

إعداد Visual Studio Code لتصحيح أخطاء NET.

  1. افتح Program.cs عن طريق تحديده.

  2. في المرة الأولى التي تقوم فيها بفتح ملف C# في Visual Studio Code، ستتلقى مطالبة بتثبيت ملحقات مستحسنة لـ C#. إذا رأيت هذه المطالبة، فحدد الزر تثبيت في المطالبة.

    لقطة شاشة لمطالبة Visual Studio Code بتثبيت ملحق C#.

  3. ستثبت Visual Studio Code الملحق C#‎ وتظهر مطالبة أخرى بإضافة الأصول المطلوبة لإنشاء مشروعك وتصحيح أخطائه. حدد الزر نعم.

    لقطة شاشة لمطالبة Visual Studio Code بإضافة الأصول المطلوبة لإنشاء مشروع .NET الخاص بك وتصحيح أخطائه.

  4. يمكنك إغلاق علامة التبويب Extension: C#‎ للتركيز على التعليمة البرمجية التي سنقوم بتصحيح أخطائها.

إضافة منطق برنامج Fibonacci

يكتب مشروعنا الحالي رسالة "مرحبًا بالعالم" إلى وحدة التحكم، والتي لا تعطينا الكثير لتصحيح الأخطاء. بدلاً من ذلك، سوف تستخدم برنامج .NET موجز لحساب العدد Nth لتسلسل Fibonacci.

تسلسل Fibonacci هو مجموعة من الأرقام التي تبدأ بالأرقام 0 و1، مع كون كل رقم آخر تابع هو مجموع الرقمين السابقين. يستمر التسلسل كما هو موضح هنا:

0, 1, 1, 2, 3, 5, 8, 13, 21...
  1. افتح Program.cs عن طريق تحديده.

  2. استبدال محتويات Program.cs بالتعليمة البرمجية التالية:

    int result = Fibonacci(5);
    Console.WriteLine(result);
    
    static int Fibonacci(int n)
    {
        int n1 = 0;
        int n2 = 1;
        int sum;
    
        for (int i = 2; i < n; i++)
        {
            sum = n1 + n2;
            n1 = n2;
            n2 = sum;
        }
    
        return n == 0 ? n1 : n2;
    }
    

    إشعار

    تحتوي هذه التعليمة البرمجية على خطأ، والذي سنقوم بتصحيحه لاحقًا في هذه الوحدة النمطية. نحن لا نوصي باستخدامها في أي من تطبيقات Fibonacci الحرجة حتى نصلح هذا الخطأ.

  3. احفظ الملف عن طريق تحديد Ctrl + S لنظام التشغيل Windows وLinux. حدد Cmd+ S لنظام التشغيل Mac.

  4. دعونا نلقي نظرة على كيفية عمل التعليمات البرمجية المحدثة قبل أن نصححها. تشغيل البرنامج بإدخال الأمر التالي في المحطة الطرفية:

    dotnet run
    

    نافذة “Terminal” مع إخراج البرنامج المعدل.

  5. تظهر النتيجة، 3، في إخراج المحطة الطرفية. عند الرجوع إلى مخطط تسلسل Fibonacci هذا الذي يعرض موضع التسلسل المستند إلى الصفر لكل قيمة بين قوسين، سترى أن النتيجة يجب أن تكون 5. حان الوقت للتعرف على مصحح الأخطاء وإصلاح هذا البرنامج.

    0 (0), 1 (1), 1 (2), 2 (3), 3 (4), 5 (5), 8 (6), 13 (7), 21 (8)...
    

تحليل المشاكل

  1. ابدأ تشغيل البرنامج عن طريق تحديد علامة التبويب Run and Debug على اليسار، ثم تحديد زر Start debugging . قد تحتاج إلى تحديد الزر Run and Debug أولا، ثم حدد ملف Program.cs .

    لقطة شاشة لزر «Start debugging» في تعليمة برمجية «Visual Studio»

    يجب أن تلاحظ انتهاء البرنامج بسرعة. هذا أمر طبيعي لأنك لم تقم بإضافة أي نقاط توقف حتى الآن.

  2. إذا لم تظهر وحدة تحكم تتبع الأخطاء، فحدد Ctrl+Shift+Y لنظامي التشغيل Windows وLinux أو Cmd+Shift+Y ل Mac. يجب أن تشاهد عدة أسطر من المعلومات التشخيصية، متبوعة بهذه الأسطر في النهاية:

    ...
    Loaded 'C:\Program Files\dotnet\shared\Microsoft.NETCore.App\6.0.0\System.Threading.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
    Loaded 'C:\Program Files\dotnet\shared\Microsoft.NETCore.App\6.0.0\System.Text.Encoding.Extensions.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
    3
    The program '[88820] DotNetDebugging.dll' has exited with code 0 (0x0).
    

تخبرك الأسطر في الأعلى أن إعدادات تصحيح الأخطاء الافتراضية تمكن الخيار "التعليمة البرمجية الخاصة بي فقط". ويعني هذا أن مصحح الأخطاء لن يصحح إلا التعليمات البرمجية الخاصة بك فقط ولن يدخل إلى التعليمات البرمجية للمصدر لـ .NET إلا إذا تم تعطيل هذا الوضع. يسمح لك هذا الخيار بالتركيز على تصحيح أخطاء التعليمة البرمجية الخاصة بك.

في نهاية خرج وحدة تحكم تصحيح الأخطاء، سترى أن البرنامج يكتب 3 إلى وحدة التحكم ثم يخرج بتعليمة برمجية 0. عادة ما تشير التعليمة البرمجية للخروج من البرنامج 0 إلى أن البرنامج تم تشغيله والخروج منه دون تعطله. ومع ذلك، هناك فرق بين التعطل وإرجاع القيمة الصحيحة. في هذه الحالة، طلبنا من البرنامج حساب القيمة الخامسة لتسلسل Fibonacci:

0 (0), 1 (1), 1 (2), 2 (3), 3 (4), 5 (5), 8 (6), 13 (7), 21 (8)...

القيمة الخامسة في هذه القائمة هي 5، ولكن برنامجنا أرجع 3. دعنا نستخدم مصحح الأخطاء لتشخيص هذا الخطأ وإصلاحه.

استخدام نقاط التوقف والتنفيذ خطوة بخطوة

  1. أضف نقطة توقف بالنقر فوق الهامش الأيسر عند السطر 1 في int result = Fibonacci(5);.

    لقطة شاشة لموقع نقطة التوقف في التعليمات البرمجية.

  2. ابدأ تصحيح الأخطاء مرة أخرى. يبدأ البرنامج في التنفيذ. يتوقف (إيقاف التنفيذ مؤقتاً) في السطر 1 بسبب نقطة التوقف التي قمت بتعيينها. استخدم عناصر تحكم مصحح الأخطاء للدخول إلى الدالة Fibonacci().

    لقطة شاشة لزر

التحقق من حالة المتغيرات

الآن، استغرق بعض الوقت لفحص قيم المتغيرات المختلفة باستخدام «لوحة المتغيرات».

لقطة شاشة للوحة “Variables”.

  • ما هي القيمة الموضحة للمعلمة n ؟
  • في بداية تنفيذ الدالة، ما هي قيم المتغيرات المحلية n1، n2، و sum؟
  1. بعد ذلك، سنتقدم إلى الحلقة for باستخدام عنصر التحكم تخطي في مصحح الأخطاء.

    لقطة شاشة لزر

  2. استمر في التقدم حتى تضغط على السطر الأول داخل الحلقة for، في السطر الذي يقرأ:

    sum = n1 + n2;
    

إشعار

ربما لاحظت أن الانتقال عبر for(...) {} الخط يتطلب خطوات متعددة في الأوامر. يحدث هذا الموقف بسبب وجود عدة عبارات على هذا السطر. عندما تتقدم، يمكنك الانتقال إلى العبارة التالية في التعليمة البرمجية الخاصة بك. عادة، توجد عبارة واحدة لكل سطر. إذا لم يكن الأمر كذلك، فأنت بحاجة إلى خطوات متعددة للانتقال إلى السطر التالي.

التفكير في التعليمة البرمجية

يتمثل جزء هام من تصحيح الأخطاء في التوقف وأخذ بعض التخمينات المستنيرة حول ما تعتقد أن أجزاء التعليمة البرمجية (كل من الدوال والكتل، مثل الحلقات) تحاول القيام به. لا بأس إذا لم تكن متأكدًا، فهذا جزء من عملية تصحيح الأخطاء. ولكن كونك مشاركًا بنشاط في عملية تصحيح الأخطاء سيساعدك على تحديد موقع الأخطاء بسرعة أكبر.

قبل أن نتعمق من ذلك، دعونا نتذكر أن تسلسل Fibonacci هو سلسلة من الأرقام التي تبدأ بالأرقام 0 و1، مع كون كل رقم آخر تابع هو مجموع الرقمين السابقين.

وهذا يعني أنه:

Fibonacci(0) = 0
Fibonacci(1) = 1
Fibonacci(2) = 1 (0 + 1)
Fibonacci(3) = 2 (1 + 1)
Fibonacci(4) = 3 (1 + 2)
Fibonacci(5) = 5 (2 + 3)

بفهم هذا التعريف والنظر إلى هذه الحلقة for، يمكننا أن نستنتج ما يلي:

  1. تبدأ الحلقة في العد من 2 إلى n (رقم تسلسل Fibonacci الذي نبحث عنه).
  2. إذا كان n أقل من 2، فلن يتم تشغيل الحلقة. العبارة returnفي نهاية الدالة سوف ترجع 0 إذا كان n 0 و1 إذا كان n 1 أو 2. هذه هي القيم الصفرية، الأولى، والثانية في سلسلة Fibonacci، حسب التعريف.
  3. الحالة الأكثر إثارة للاهتمام هي عندما يكون n أكبر من 2. في تلك الحالات، يتم تعريف القيمة الحالية كمجموع القيمتين السابقتين. بالنسبة لهذه الحلقة، تُعتبر n1 و n2 القيمتين السابقتين، و sum هي قيمة التكرار الحالية. لذلك، في كل مرة نكتشف مجموع القيمتين السابقتين ونضبطهما على sum، نقوم بتحديث قيم n1 و n2 الخاصة بنا.

حسنًا، لا نحتاج أن نبالغ في التفكير في الأمر بعد ذلك. يمكننا أن نستند على مصحح الأخطاء لدينا قليلاً. ولكن الأمر يستحق التفكير في التعليمة البرمجية لمعرفة ما إذا كانت تقوم بما نتوقعه والعلم عندما لا تفعل ذلك.

تحديد موقع الخطأ باستخدام نقاط التوقف

يمكن أن يكون التنقل عبر التعليمات البرمجية مفيدا ولكنه ممل، خاصة عندما تعمل مع الحلقات أو التعليمات البرمجية الأخرى التي يتم استدعاؤها بشكل متكرر. بدلاً من التنقل عبر الحلقة مرارًا وتكرارًا، يمكننا تعيين نقطة توقف جديدة على السطر الأول من الحلقة.

عندما نفعل هذا، من المهم أن نكون استراتيجيين فيما يتعلق بالمكان الذي نضع فيه نقاط التوقف. نحن مهتمون بشكل خاص بقيمة sum، لأنها تمثل الحد الأقصى الحالي لقيمة Fibonacci. وبسبب ذلك، دعونا نضع نقطة التوقف الخاصة بنا في السطر بعد تعيينsum.

  1. إضافة نقطة توقف ثانية على السطر 13.

    لقطة شاشة تظهر نقطة توقف ثانية يتم تعيينها.

    إشعار

    إذا لاحظت أنك تستمر في تشغيل التعليمة البرمجية ثم تتقدم سطر أو اثنين، فيمكنك تحديث نقاط التوقف الخاصة بك بسهولة إلى سطور أكثر كفاءة.

  2. لدينا الآن نقطة توقف جيدة معينة في الحلقة، لذا استخدم عنصر تحكم مصحح الأخطاء متابعة للتقدم حتى بلوغ نقطة التوقف. بالنظر إلى المتغيرات المحلية لدينا، نرى السطور التالية:

    n [int]: 5
    n1 [int]: 0
    n2 [int]: 1
    sum [int]: 1
    i [int]: 2
    

    يبدو أن كل هذه السطور صحيحة. المرة الأولى خلال الحلقة، تكون sum للقيمتين السابقتين هي 1. بدلا من أن التنقل سطرًا بسطر، يمكننا الاستفادة من نقاط التوقف لدينا للقفز إلى المرة القادمة من خلال الحلقة.

  3. حدد متابعة لمتابعة تدفق البرنامج حتى بلوغ نقطة التوقف التالية، والتي ستكون في العبور التالي خلال الحلقة.

    إشعار

    لا تقلق كثيراً بشأن تخطي الخطأ عند استخدام متابعة. يجب أن تتوقع أن تقوم بتصحيح الأخطاء غالبًا خلال التعليمة البرمجية عدة مرات للبحث عن المشكلة. غالبًا ما يكون من الأسرع التشغيل خلالها عدة مرات بدلاً من الحذر الشديد عند التنقل.

    هذه المرة، نرى القيم التالية:

    n [int]: 5
    n1 [int]: 1
    n2 [int]: 1
    sum [int]: 2
    i [int]: 3
    

    لنفكر فيها. هل هذه القيم لا تزال منطقية؟ يبدو أنها كذلك. بشأن رقم Fibonacci الثالث، نتوقع أن نرى sum لدينا يساوي 2، وهو كذلك.

  4. حسناً، لنحدد متابعة للحلقة لتكرارها مرة أخرى.

    n [int]: 5
    n1 [int]: 1
    n2 [int]: 2
    sum [int]: 3
    i [int]: 4
    

    مرة أخرى، الأمور تبدو جيدة. ومن المتوقع أن تكون القيمة الرابعة في السلسلة هي 3.

  5. في هذه المرحلة، قد تبدأ في التساؤل إذا ما كانت التعليمة البرمجية صحيحة طوال الوقت وكنت تعتقدها خطأ! لنستمر معها للمرة الأخيرة من خلال الحلقة. حدد متابعة مرة أخرى.

    انتظر دقيقة. انتهى تشغيل البرنامج وتمت طباعة 3! هذا ليس صحيحًا.

    حسنًا، لا تقلق. لم نفشل، لقد تعلمنا الدرس. نحن نعلم الآن أن التعليمة البرمجية تعمل خلال الحلقة بشكل صحيح إلى أن تكون i مساوية لـ4، ولكنها تخرج بعد ذلك قبل حساب القيمة النهائية. بدأت أحصل على بعض الأفكار حول مكان الخطأ. هل أنت؟

  6. دعونا نعيّن نقطة توقف أخرى على السطر 17، والتي تقول:

    return n == 0 ? n1 : n2;
    

    ستسمح لنا نقطة التوقف هذه بفحص حالة البرنامج قبل إنهاء الدالة. لقد تعلمنا بالفعل كل ما يمكن أن نتوقعه من نقاط التوقف السابقة في السطرين 1 و13، حتى نتمكن من مسحهما.

  7. إزالة نقاط التوقف السابقة على الأسطر 1 و13. يمكنك القيام بذلك بالنقر فوقها في الهامش الموجود بجانب أرقام الأسطر، أو عن طريق إلغاء تحديد خانات الاختيار لنقطة التوقف للسطرين 1 و13 في جزء نقاط التوقف في أسفل اليسار.

    لقطة شاشة تعرض نقاط التوقف المدرجة في جزء نقاط التوقف.

    الآن بعد أن فهمنا ما يحدث على نحو أفضل بكثير ووضعنا نقطة توقف مصممة للإمساك ببرنامجنا في فعل سوء التصرف، ينبغي أن نكون قادرين على تحديد هذا الخطأ!

  8. ابدأ تشغيل مصحح الأخطاء مرة أخيرة.

    n [int]: 5
    n1 [int]: 2
    n2 [int]: 3
    sum [int]: 3
    

    حسناً، هذا ليس صحيحًا. طالبنا على وجه التحديد بـFibonacci(5)، وحصلنا Fibonacci(4). تقوم هذه الدالة بإرجاع n2، وكل تكرار للحلقة يقوم بحساب القيمة sum وتعيين n2 تساوي sum.

    استناداً إلى هذه المعلومات، وتشغيل تصحيح الأخطاء السابق، يمكننا ملاحظة أن الحلقة خرجت عندما كانت i 4، وليس 5.

    لنلقِ نظرة أقرب قليلاً على السطر الأول من الحلقة for.

    for (int i = 2; i < n; i++)
    

    حسناً، انتظر دقيقة! هذا يُعني أنه سيخرج بمجرد أن يرى الجزء العلوي من التكرار الحلقي أن i لم يعد أقل من n. وهذا يعني أن التعليمة البرمجية للحلقة لن تعمل للحالة حيث i يساوي n. يبدو أن ما أردناه هو أن التشغيل حتى i <= n، بدلاً من ذلك:

    for (int i = 2; i <= n; i++)
    

    لذا مع هذا التغيير، يجب أن تبدو برنامجك المحدث مشابهًا لهذا المثال:

    int result = Fibonacci(5);
    Console.WriteLine(result);
    
    static int Fibonacci(int n)
    {
        int n1 = 0;
        int n2 = 1;
        int sum;
    
        for (int i = 2; i <= n; i++)
        {
            sum = n1 + n2;
            n1 = n2;
            n2 = sum;
        }
    
        return n == 0 ? n1 : n2;
    }
    
  9. أوقف جلسة عمل تصحيح الأخطاء إذا لم تكن قد قمت بذلك بالفعل.

  10. بعد ذلك، قم بإجراء التغيير السابق على السطر 10 واترك نقطة التوقف الخاصة بنا على السطر 17.

  11. أعد تشغيل مصحح الأخطاء. هذه المرة، عندما نبلغ نقطة التوقف في خط 17، سنرى القيم التالية:

    n [int]: 5
    n1 [int]: 3
    n2 [int]: 5
    sum [int]: 5
    

    مرحبًا! يبدو أننا حصلنا عليها! عمل رائع، لقد أنقذت الموقف بالنسبة لـ Fibonacci, Inc.!

  12. حدد متابعة فقط للتأكد من إرجاع البرنامج للقيمة الصحيحة.

    5
    The program '[105260] DotNetDebugging.dll' has exited with code 0 (0x0).
    

    وهذا يرجع الخرج الصحيح.

لقد نجحت! لقد قمت بتصحيح أخطاء بعض التعليمات البرمجية التي لم تكتبها باستخدام مصحح أخطاء .NET في Visual Studio Code.

في الوحدة النمطية التالية، ستتعلم كيفية جعل تصحيح أخطاء التعليمة البرمجية التي تكتبها أسهل باستخدام ميزات التسجيل والتتبع المضمنة في .NET.