تمرين - تتبع الأخطاء باستخدام Visual Studio
حان الوقت لوضع معرفتك المكتسبة حديثا في تصحيح الأخطاء موضع التنفيذ. إنه يومك الأول في الوظيفة، وتريد وضع مهارات تصحيح أخطاء .NET الخاصة بك للعمل عن طريق إصلاح خطأ في المنتج الرئيسي للشركة، وهو حاسبة Fibonacci.
إنشاء نموذج مشروع .NET لتصحيح الأخطاء
لإعداد Visual Studio لتصحيح أخطاء .NET، نحتاج أولا إلى مشروع .NET. يوفر Visual Studio الكثير من قوالب المبتدئين التي تجعل إنشاء مشروع جديد أمراً سهلاً.
حدد من Visual Studioملف>جديد>مشروع.
في مربع الحوار Create a new Project، حددConsole App واختر Next.
قم بتسمية المشروع DotNetDebugging، واختر الموقع الذي تريد حفظه فيه. اترك القيم الأخرى في الإعدادات الافتراضية الخاصة بها، ثم حدد التالي.
حدد إنشاء على الشاشة النهائية.
ينشئ Visual Studio مشروع وحدة التحكم لنا باستخدام القالب الذي حددناه. بمجرد تحميل المشروع، افتح Program.cs عن طريق تحديده.
إضافة منطق برنامج Fibonacci
يكتب مشروعنا الحالي رسالة "مرحبًا بالعالم" إلى وحدة التحكم، والتي لا تعطينا الكثير لتصحيح الأخطاء. بدلا من ذلك، دعنا نستخدم برنامج .NET قصير لحساب العدد N من تسلسل Fibonacci.
تسلسل Fibonacci هو مجموعة من الأرقام التي تبدأ بالأرقام 0 و1، مع كون كل رقم آخر تابع هو مجموع الرقمين السابقين. يستمر التسلسل كما هو موضح هنا:
0, 1, 1, 2, 3, 5, 8, 13, 21...
يحتوي نموذج التعليمات البرمجية التالي على خطأ، لذلك دعونا نستخدم أدوات تصحيح الأخطاء في Visual Studio لتشخيص المشكلة وحلها.
- استبدال محتويات Program.cs بالتعليمة البرمجية التالية:
int result = Fibonacci(5);
Console.WriteLine(result);
static int Fibonacci(int n)
{
Console.WriteLine("The output is: ");
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 الحرجة حتى نصلح هذا الخطأ.
احفظ الملف عن طريق تحديد Ctrl + S لنظامي التشغيل Windows وLinux. حدد Cmd+ S لنظام التشغيل Mac.
دعونا نلقي نظرة على كيفية عمل التعليمة البرمجية المحدثة قبل أن نصحح أخطاءها. قم بتشغيل البرنامج بالضغط على زر البدء الأخضر في شريط أوامر Visual Studio.
في نهاية إخراج وحدة تحكم تتبع الأخطاء، يمكنك أن ترى أن البرنامج يكتب 3 إلى وحدة التحكم ثم يخرج مع التعليمات البرمجية 0. عادة ما تشير التعليمة البرمجية للخروج من البرنامج 0 إلى أن البرنامج تم تشغيله والخروج منه دون تعطله. ومع ذلك، هناك فرق بين التعطل وإرجاع القيمة الصحيحة.
في هذه الحالة، طلبنا من البرنامج حساب القيمة الخامسة لتسلسل Fibonacci:
0, 1, 1, 2, 3, 5, 8, 13, 21...
القيمة الخامسة في هذه القائمة هي 5، ولكن برنامجنا أرجع 3. دعنا نستخدم مصحح الأخطاء لتشخيص هذا الخطأ وإصلاحه.
استخدام نقاط التوقف والتنفيذ خطوة بخطوة
أضف نقطة توقف بالنقر فوق الهامش الأيسر عند السطر 1 في
int result = Fibonacci(5);.ابدأ تصحيح الأخطاء مرة أخرى. يبدأ البرنامج في التنفيذ. يتوقف (إيقاف التنفيذ مؤقتاً) في السطر 1 بسبب نقطة التوقف التي قمت بتعيينها. استخدم عناصر تحكم مصحح الأخطاء للدخول إلى الدالة
Fibonacci().
التحقق من حالة المتغيرات
الآن، استغرق بعض الوقت لفحص قيم المتغيرات المختلفة باستخدام لوحة Locals.
- ما هي القيمة الموضحة للمعلمة
n؟ - في بداية تنفيذ الدالة، ما هي قيم المتغيرات المحلية
n1،n2، وsum؟
بعد ذلك، نتقدم إلى التكرار
forالحلقي باستخدام عنصر تحكم مصحح الأخطاء Step Over .
استمر في التقدم حتى تصل إلى السطر الأول داخل الحلقة
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، يمكننا أن نستنتج ما يلي:
- تبدأ الحلقة في العد من 2 إلى
n(رقم تسلسل Fibonacci الذي نبحث عنه). - إذا كان
nأقل من 2، فلن يتم تشغيل الحلقة أبدا. ترجعreturnالعبارة في نهاية الدالة 0 إذا كانتn0، و1 إذا كانتn1 أو 2. هذه القيم هي القيم الصفرية والأولى والثانية في سلسلة Fibonacci، حسب التعريف. - الحالة الأكثر إثارة للاهتمام هي عندما يكون
nأكبر من 2. في تلك الحالات، يتم تعريف القيمة الحالية كمجموع القيمتين السابقتين. بالنسبة لهذه الحلقة، تُعتبرn1وn2القيمتين السابقتين، وsumهي قيمة التكرار الحالية. وبسبب هذا المنطق، في كل مرة نكتشف مجموع القيمتين السابقتين ونعينها علىsum، نقوم بتحديث قيمنا وقيمناn1n2.
حسنًا، لا نحتاج أن نبالغ في التفكير في الأمر بعد ذلك. يمكننا أن نستند على مصحح الأخطاء لدينا قليلاً. ولكن الأمر يستحق التفكير في التعليمة البرمجية لمعرفة ما إذا كانت تقوم بما نتوقعه والعلم عندما لا تفعل ذلك.
تحديد موقع الخطأ باستخدام نقاط التوقف
قد يكون التنقل عبر التعليمة البرمجية مفيدًا ولكنه ممل. خاصة عندما تعمل مع التكرارات الحلقية أو التعليمات البرمجية الأخرى التي يتم استدعاؤها بشكل متكرر. بدلاً من التنقل عبر الحلقة مرارًا وتكرارًا، يمكننا تعيين نقطة توقف جديدة على السطر الأول من الحلقة.
عندما نفعل هذا، من المهم أن نكون استراتيجيين فيما يتعلق بالمكان الذي نضع فيه نقاط التوقف. نحن مهتمون بشكل خاص بقيمة sum، لأنها تمثل قيمة Fibonacci القصوى الحالية. لذلك، دعونا نضع نقطة التوقف الخاصة بنا على السطر بعدsum تعيين.
إضافة نقطة توقف ثانية في السطر 14.
إشعار
إذا لاحظت أنك تستمر في تشغيل التعليمة البرمجية ثم تتقدم سطر أو اثنين، فيمكنك تحديث نقاط التوقف الخاصة بك بسهولة إلى سطور أكثر كفاءة.
الآن بعد أن أصبح لدينا نقطة توقف جيدة معينة في الحلقة، حدد متابعة في عناصر تحكم مصحح الأخطاء للتقدم حتى يتم الوصول إلى نقطة التوقف. بالنظر إلى المتغيرات المحلية لدينا، نرى السطور التالية:
n [int]: 5 n1 [int]: 0 n2 [int]: 1 sum [int]: 1 i [int]: 2يبدو أن كل هذه السطور صحيحة. المرة الأولى خلال الحلقة، تكون
sumللقيمتين السابقتين هي 1. بدلا من أن التنقل سطرًا بسطر، يمكننا الاستفادة من نقاط التوقف لدينا للقفز إلى المرة القادمة من خلال الحلقة.حدد متابعة لمتابعة تدفق البرنامج حتى بلوغ نقطة التوقف التالية، والتي ستكون في العبور التالي خلال الحلقة.
إشعار
لا تقلق كثيراً بشأن تخطي الخطأ عند استخدام متابعة. يجب أن تتوقع أنك قد تتبع الأخطاء من خلال التعليمات البرمجية عدة مرات للعثور على المشكلة. غالبًا ما يكون من الأسرع التشغيل خلالها عدة مرات بدلاً من الحذر الشديد عند التنقل.
هذه المرة، نرى القيم التالية:
n [int]: 5 n1 [int]: 1 n2 [int]: 1 sum [int]: 2 i [int]: 3هل هذه القيم لا تزال منطقية؟ يبدو أنها كذلك. بشأن رقم Fibonacci الثالث، نتوقع أن نرى
sumلدينا يساوي 2، وهو كذلك.لنحدد Continue لتكرارها مرة أخرى.
n [int]: 5 n1 [int]: 1 n2 [int]: 2 sum [int]: 3 i [int]: 4والنتيجة صحيحة. ومن المتوقع أن تكون القيمة الرابعة في السلسلة هي 3.
في هذه المرحلة، قد تبدأ في التساؤل إذا ما كانت التعليمة البرمجية صحيحة طوال الوقت وكنت تعتقدها خطأ! لنستمر معها للمرة الأخيرة من خلال الحلقة. حدد متابعة مرة أخرى.
انتهى تشغيل البرنامج والمخرجات هي 3! نتيجتنا غير صحيحة.
نحن نعلم الآن أن التعليمة البرمجية تعمل خلال الحلقة بشكل صحيح إلى أن تكون
iمساوية لـ4، ولكنها تخرج بعد ذلك قبل حساب القيمة النهائية. قمنا بتضييق مكان الخطأ.دعونا نعيّن نقطة توقف أخرى في سطر 18، الذي يقرأ:
return n == 0 ? n1 : n2;تتيح لنا نقطة التوقف هذه فحص حالة البرنامج قبل إنهاء الدالة. لقد تعلمنا بالفعل كل ما يمكن أن نتوقعه من نقاط التوقف السابقة على الخطين 1 و13، حتى نتمكن من مسحها.
احذف نقاط التوقف السابقة في السطرين 1 و13. حدد نقاط التوقف في الهامش إلى جانب أرقام الأسطر، أو قم بإلغاء تحديد خانات الاختيار لنقطة التوقف للسطرين 1 و13 في جزء نقاط التوقف في أسفل اليسار.
الآن بعد أن فهمنا بشكل أفضل ما يحدث ووضع نقطة توقف مصممة للقبض على برنامجنا في فعل سوء التصرف. الآن يجب أن نكون قادرين على التقاط هذا الخطأ!
ابدأ تشغيل مصحح الأخطاء مرة أخيرة.
n [int]: 5 n1 [int]: 2 n2 [int]: 3 sum [int]: 3طالبنا على وجه التحديد بـFibonacci(5)، وحصلنا Fibonacci(4)، وهذا غير صحيح. تقوم هذه الدالة بإرجاع
n2، وكل تكرار للحلقة يقوم بحساب القيمةsumوتعيينn2تساويsum.استناداً إلى هذه المعلومات، وتشغيل تصحيح الأخطاء السابق، يمكننا ملاحظة أن الحلقة خرجت عندما كانت
i4، وليس 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) { Console.WriteLine("The output is: "); 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; }أوقف جلسة عمل تصحيح الأخطاء إذا لم تكن قد قمت بذلك بالفعل.
قم بإجراء التغيير السابق على السطر 11، واترك نقطة التوقف في السطر 18.
أعد تشغيل مصحح الأخطاء. هذه المرة، عندما نصل إلى نقطة التوقف في السطر 18، نرى القيم التالية:
n [int]: 5 n1 [int]: 3 n2 [int]: 5 sum [int]: 5مرحبًا! يبدو أننا حصلنا عليها! عمل رائع، قمت بحفظ اليوم في Fibonacci، Inc.!
حدد متابعة فقط للتأكد من إرجاع البرنامج للقيمة الصحيحة.
5 The program '[105260] DotNetDebugging.dll' has exited with code 0 (0x0).وهذا يرجع الخرج الصحيح.
لقد نجحت! لقد قمت بتصحيح بعض التعليمات البرمجية التي لم تكتبها باستخدام مصحح أخطاء .NET في Visual Studio.
في الوحدة التالية، ستتعلم كيفية تسهيل تصحيح أخطاء التعليمات البرمجية التي تكتبها باستخدام ميزات التسجيل والتتبع المضمنة في .NET.