تصحيح أخطاء C#: من "لماذا لا يعمل؟" إلى "أعرف مكان الخطأ"
\n\nكل مطور C# يواجه عاجلاً أم آجلاً موقفًا حيث يتم تجميع الكود وتشغيله، لكنه يفعل شيئًا مختلفًا تمامًا عما هو متوقع. أو يتعطل بخطأ لا يمكن إعادة إنتاجه في بيئة الاختبار. في مثل هذه اللحظات، يتحول تصحيح أخطاء C# من مهمة روتينية إلى فن حقيقي.
\n\nفي هذه المقالة، سنستعرض التقنيات والأدوات التي ستساعدك ليس فقط في العثور على الخلل، بل في القيام بذلك بسرعة وفعالية. لن نقتصر على F5 القياسي - سنتحدث عن نقاط التوقف المتقدمة، والتعبيرات الشرطية، وتحليل الذاكرة، وحتى العمل مع تفريغ الذاكرة في WinDbg. هيا بنا!
\n\nتقنيات تصحيح أساسية لكنها قوية في C#
\n\nقبل الانتقال إلى الأدوات الغريبة، دعنا نتأكد من أنك تستخرج أقصى استفادة من Visual Studio. العديد من المطورين يستخدمون فقط F9 (وضع نقطة توقف) و F10 (تخطي)، وهذا خطأ.
نقاط التوقف الشرطية (Conditional Breakpoints)
\n\nتخيل: لديك حلقة من 1000 تكرار، والخلل يظهر فقط في التكرار رقم 567. هل ستضع نقطة توقف وتضغط F5 567 مرة؟ لا. استخدم نقاط التوقف الشرطية.
\n\nfor (int i = 0; i < 1000; i++)\n{\n // بعض المنطق\n ProcessItem(items[i]);\n}\n\nانقر بزر الماوس الأيمن على الدائرة الحمراء لنقطة التوقف ← اختر "Conditions" ← أدخل i == 567. عندما يصل العداد إلى القيمة المطلوبة، سيتوقف المصحح تلقائيًا. هذا يوفر ساعات من العمر.
كشرط، يمكنك استخدام ليس فقط المقارنة، بل أي تعبير منطقي في C#. على سبيل المثال: items[i].IsValid == false && items[i].Id > 100.
نقاط التوقف مع الإجراءات (Tracepoints / Actions)
\n\nأحيانًا لا تحتاج إلى إيقاف التنفيذ، بل فقط تسجيل سجل في لحظة معينة. لهذا الغرض، توجد نقاط توقف مع إجراءات. ضع نقطة توقف، انقر بزر الماوس الأيمن ← "Actions" ← أدخل رسالة مثل تم استدعاء الدالة مع المعامل: {parameter}.
هذا يعمل مثل Console.WriteLine، لكن دون تغيير الكود. يمكنك عرض قيم المتغيرات مباشرة في نافذة Output دون مقاطعة عمل التطبيق.
"الإرفاق بعملية" (Attach to Process)
\n\nهل حدث أن الخلل يظهر فقط في بيئة الإنتاج، ولكن ليس محليًا؟ استخدم Debug → Attach to Process. يمكنك الاتصال بعملية قيد التشغيل بالفعل (مثل IIS، أو Windows Service، أو تطبيق سطح المكتب).
ملاحظة مهمة: تأكد من أن لديك ملفات PDB (الرموز) للإصدار الذي يعمل. وإلا، بدلاً من أسماء المتغيرات، سترى Variable1 و Variable2.
تقنيات متقدمة: التشخيص دون توقف
\n\nليست كل الأخطاء يمكن اكتشافها في المصحح. أحيانًا، تغيير التنفيذ يغير سلوك البرنامج (مثلًا بسبب التوقيت في الكود متعدد الخيوط). لمثل هذه الحالات، توجد تقنيات أخرى لتصحيح أخطاء C#.
\n\nتسجيل السجلات باستخدام DiagnosticSource و Serilog
\n\nالأداة المدمجة System.Diagnostics.Trace جيدة، لكن للمشاريع الجادة، من الأفضل استخدام التسجيل المنظم. Serilog هو أحد أشهر مسجلات السجلات لـ .NET.
using Serilog;\n\nLog.Logger = new LoggerConfiguration()\n .WriteTo.Console()\n .WriteTo.File("log.txt", rollingInterval: RollingInterval.Day)\n .CreateLogger();\n\ntry\n{\n var result = SomeRiskyOperation();\n Log.Information("تم تنفيذ العملية بنجاح. النتيجة: {Result}", result);\n}\ncatch (Exception ex)\n{\n Log.Error(ex, "خطأ أثناء تنفيذ العملية");\n}\n\nالسجلات المنظمة تسمح بالبحث عن الأخطاء ليس حسب النص، بل حسب الحقول. على سبيل المثال، يمكنك العثور على جميع السجلات التي تحتوي على OrderId = 12345 خلال الساعة الأخيرة. هذا أقوى من grep على ملف نصي.