التسجيل والتتبع في تطبيقات .NET
بينما تستمر في تطوير التطبيق الخاص بك ويزداد تعقيدا، ستحتاج إلى تطبيق تشخيصات تصحيح أخطاء إضافية على التطبيق الخاص بك.
يعد التتبع طريقة لمراقبة تنفيذ التطبيق الخاص بك أثناء تشغيله. يمكنك إضافة تتبع وتصحيح الأجهزة إلى تطبيق .NET الخاص بك عند تطويره. يمكنك استخدام هذا التقرير عن حالة النظام أثناء تطوير التطبيق وبعد نشره.
هذه التقنية البسيطة قوية بشكل مدهش. يمكنك استخدامه في الحالات التي تحتاج فيها إلى أكثر من مصحح أخطاء:
- قد يكون من الصعب تصحيح المشكلات التي تحدث على مدى فترات زمنية طويلة باستخدام مصحح الأخطاء التقليدي. تسمح السجلات بمراجعة مفصلة بعد الوفاة التي تمتد لفترات طويلة من الوقت. وعلى النقيض من ذلك، يتم تقييد مصححي الأخطاء بالتحليل في الوقت الحقيقي.
- غالبا ما يكون من الصعب تصحيح أخطاء التطبيقات متعددة مؤشرات الترابط والتطبيقات الموزعة. إرفاق مصحح الأخطاء يميل إلى تعديل السلوكيات. يمكنك تحليل السجلات التفصيلية حسب الحاجة لفهم الأنظمة المعقدة.
- قد تنشأ المشكلات في التطبيقات الموزعة من تفاعل معقد بين العديد من المكونات. قد لا يكون من المعقول توصيل مصحح أخطاء بكل جزء من النظام.
- لا يجب تثبيت العديد من الخدمات. غالبا ما يؤدي إرفاق مصحح أخطاء إلى فشل المهلة.
- لا يتم توقع المشكلات دائما. تم تصميم التسجيل والتتبع للنفقات العامة المنخفضة بحيث يمكن للبرامج التسجيل دائما في حالة حدوث مشكلة.
كتابة المعلومات إلى نوافذ الإخراج
حتى هذه النقطة، كنا نستخدم وحدة التحكم لعرض المعلومات لمستخدم التطبيق. هناك أنواع أخرى من التطبيقات التي تم إنشاؤها باستخدام .NET التي تحتوي على واجهات مستخدم، مثل تطبيقات الجوال والويب وسطح المكتب، ولا توجد وحدة تحكم مرئية. في هذه التطبيقات، يسجل System.Console الرسائل "خلف الكواليس". قد تظهر هذه الرسائل في نافذة إخراج في Visual Studio أو Visual Studio Code. قد تكون أيضا ناتجة إلى سجل نظام مثل logcatAndroid. ونتيجة لذلك، يجب أن تأخذ بعين الاعتبار عند استخدام System.Console.WriteLine في تطبيق غير وحدة التحكم.
هذا هو المكان الذي يمكنك فيه استخدام System.Diagnostics.DebugSystem.Diagnostics.Trace بالإضافة إلى System.Console. يشكل كل من DebugTrace جزءا من System.Diagnostics ولن يكتب إلا في السجلات عند إرفاق وحدة استماع مناسبة.
اختيار واجهة برمجة تطبيقات نمط الطباعة التي يجب استخدامها متروك لك. الاختلافات الرئيسية هي:
-
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 لكل من تكوينات DebugRelease بالإضافة إلى 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.
التتبع الشرطي
بالإضافة إلى أساليب WriteWriteLine البسيطة، هناك أيضا القدرة على إضافة شروط مع WriteIfWriteLineIf. على سبيل المثال، يتحقق المنطق التالي ما إذا كان العدد صفرا ثم يكتب رسالة تصحيح الأخطاء:
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 لا تغير نتائج البرنامج إذا تمت إزالة التأكيد. وإلا، فقد تقدم عن طريق الخطأ خطأ يظهر فقط في إصدار الإصدار من البرنامج. كن حذرا بشكل خاص بشأن التأكيدات التي تحتوي على استدعاءات دالة أو إجراء.
يعد استخدام DebugTrace من مساحة الاسم System.Diagnostics طريقة رائعة لتوفير سياق إضافي عند تشغيل التطبيق وتصحيحه.