التسجيل والتتبع في تطبيقات .NET

مكتمل

بينما تستمر في تطوير التطبيق الخاص بك ويزداد تعقيدا، قد تحتاج إلى تطبيق المزيد من تشخيصات التصحيح على التطبيق الخاص بك.

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

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

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

كتابة المعلومات في نوافذ الخرج

حتى هذه المرحلة، كنا نستخدم وحدة التحكم لعرض المعلومات لمستخدم التطبيق. هناك أنواع أخرى من التطبيقات التي تم إنشاؤها باستخدام .NET التي تحتوي على واجهات مستخدم ولا توجد وحدة تحكم مرئية، مثل تطبيقات الجوال والويب وسطح المكتب. في هذه التطبيقات، يتم استخدام System.Console لتسجيل الرسائل "خلف الكواليس". قد تظهر هذه الرسائل في نافذة الإخراج في Visual Studio أو في Visual Studio Code. كما أنها قد يتم إخراجها إلى سجل نظام مثل logcat الخاص بـAndroid. ونتيجة لذلك، يجب أن تأخذ بعين الاعتبار عند استخدام System.Console.WriteLine في تطبيق غير console.

هذا الموقف هو المكان الذي يمكنك استخدامه System.Diagnostics.DebugSystem.Diagnostics.Trace بالإضافة إلى System.Console. كل Debug من و Trace هما جزء من System.Diagnostics السجلات والكتابة إليها فقط عند إرفاق وحدة استماع مناسبة.

اختيار نمط الطباعة الذي يستخدمه API متروك لكم. وتتمثل الاختلافات الرئيسية في ما يلي:

  • System.Console
    • ممكن دائمًا ويكتب إلى وحدة التحكم.
    • مفيد للمعلومات التي قد يحتاج العميل إلى رؤيتها في الإصدار.
    • لأنه أبسط نهج، System.Console غالبا ما يستخدم لتصحيح الأخطاء المؤقت المخصص. غالبًا ما لا يتم إيداع المعلمة البرمجية لتصحيح الأخطاء في عنصر التحكم في المصدر.
  • System.Diagnostics.Trace
    • تمكين فقط عند تحديد TRACE.
    • يكتب إلى أدوات الإصغاء المرفقة بشكل افتراضي، DefaultTraceListener.
    • استخدم واجهة برمجة التطبيقات هذه عند إنشاء سجلات تخطط لتمكينها في معظم البنيات.
  • System.Diagnostics.Debug
    • تمكينه فقط عند تحديد DEBUG (عندما يكون في وضع تصحيح) الأخطاء.
    • يكتب إلى مصحح الأخطاء المرفق.
    • استخدم واجهة برمجة التطبيقات هذه عند إنشاء سجلات تخطط لتمكينها فقط في بنيات التصحيح.
Console.WriteLine("This message is readable by the end user.")
Trace.WriteLine("This is a trace message when tracing the app.");
Debug.WriteLine("This is a debug message just for developers.");

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

Debug.Write("Debug - ");
Debug.WriteLine("This is a full line.");
Debug.WriteLine("This is another full line.");

هذا الخرج هو من التسجيل السابق باستخدام Debug :

Debug - This is a full line.
This is another full line.

تحديد ثوابت TRACE وDEBUG

بشكل افتراضي، عندما يتم تشغيل تطبيق تحت التصحيح، يتم تحديد الثابت DEBUG. يمكنك التحكم في هذا التعريف عن طريق إضافة DefineConstants إدخال في ملف المشروع في مجموعة خصائص. إليك مثال على تشغيل TRACE لكل من تكوينات Debug و Release بالإضافة إلى DEBUG لتكوينات Debug.

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <DefineConstants>DEBUG;TRACE</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
    <DefineConstants>TRACE</DefineConstants>
</PropertyGroup>

إذا كنت تستخدم Trace عندما لا تكون متصلا بمصحح الأخطاء، فستحتاج إلى تكوين مستمع تتبع مثل dotnet-trace.

التتبع الشرطي

بالإضافة إلى الأساليب البسيطة Write و WriteLine، هناك أيضاً إمكانية إضافة شروط مع WriteIf و WriteLineIf. على سبيل المثال، يتحقق المنطق التالي ما إذا كان العدد صفرا، ثم يكتب رسالة تصحيح الأخطاء:

if(count == 0)
{
    Debug.WriteLine("The count is 0 and this may cause an exception.");
}

يمكنك إعادة كتابته في سطر واحد من التعليمات البرمجية:

Debug.WriteLineIf(count == 0, "The count is 0 and this may cause an exception.");

يمكنك أيضا استخدام هذه الشروط مع Trace و مع العلامات التي تحددها في التطبيق الخاص بك:

bool errorFlag = false;  
System.Diagnostics.Trace.WriteIf(errorFlag, "Error in AppendData procedure.");  
System.Diagnostics.Debug.WriteIf(errorFlag, "Transaction abandoned.");  
System.Diagnostics.Trace.Write("Invalid value for data request");

التحقق من وجود شروط معينة

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

يمكنك استخدام الأسلوب Assert إما من Debug وإما Trace، الموجودة في مساحة الاسم System.Diagnostics. Debug لا يتم تضمين أساليب الفئة في نسخة الإصدار، بحيث لا تزيد حجم أو تقلل من سرعة التعليمات البرمجية للإصدار.

System.Diagnostics.Debug.Assert استخدم الأسلوب بحرية لاختبار الشروط التي يجب أن تكون صحيحة إذا كانت التعليمات البرمجية صحيحة. على سبيل المثال، افترض أنك كتبت دالة تقسم الأعداد الصحيحة. باستخدام قواعد الرياضيات، لا يمكن أن يكون المقسوم صفراً. يمكنك اختبار هذا الشرط باستخدام تأكيد:

int IntegerDivide(int dividend, int divisor)
{
    Debug.Assert(divisor != 0, $"{nameof(divisor)} is 0 and will cause an exception.");

    return dividend / divisor;
}

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

إشعار

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

كما ترى، يعد استخدام Debug ومن TraceSystem.Diagnostics مساحة الاسم طريقة رائعة لتوفير سياق مهم عند تشغيل التطبيق وتصحيحه.