سؤال

لسنوات كنت أستخدم ثابت برنامج التحويل البرمجي DEBUG في VB.NET لكتابة الرسائل إلى وحدة التحكم.لقد كنت أيضًا أستخدم System.Diagnostics.Debug.Write بطريقة مماثلة.لقد كنت أفهم دائمًا أنه عند استخدام RELEASE كخيار بناء، تم استبعاد كل هذه العبارات بواسطة المترجم، مما أدى إلى تحرير كود الإنتاج الخاص بك من الحمل الزائد لبيانات تصحيح الأخطاء.في الآونة الأخيرة، أثناء العمل مع Silverlight 2 Beta 2، لاحظت أن Visual Studio متصل بالفعل بإصدار RELEASE الذي كنت أقوم بتشغيله من موقع ويب عام وعرض بيانات DEBUG التي افترضت أنها لم يتم تجميعها حتى!الآن، ميلي الأول هو افتراض وجود خطأ ما في بيئتي، ولكنني أريد أيضًا أن أسأل أي شخص لديه معرفة عميقة بـ System.Diagnostics.Debug وخيار بناء DEBUG بشكل عام عما قد أسيء فهمه هنا.

هل كانت مفيدة؟

المحلول

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

مثال على استخدام سمة شرطية هو كما يلي (في C#، ولكنه يعمل في VB.NET أيضًا):

[ Conditional("Debug") ]
private void WriteDebug(string debugString)
{
  // do stuff
}

عند التحويل البرمجي بدون مجموعة علامات DEBUG، ستتم إزالة أي استدعاء لـ WriteDebug كما كان من المفترض أن يحدث مع Debug.Write().

نصائح أخرى

دراسة تصحيح. الكتابة طريقة.تمت الإشارة إليه مع

[Conditional("DEBUG")]

يصف.

تعليمات MSDN لـ سمة شرطية تنص على:

يشير إلى المترجمين إلى أنه ينبغي تجاهل استدعاء الطريقة أو السمة ما لم يحدد يتم تعريف رمز التجميع الشرطي.

لا يهم ما إذا كان تكوين البناء يحتوي على تسمية إصدار أو تصحيح، ما يهم هو ما إذا كان رمز DEBUG محددًا فيه.

ما أفعله هو تغليف استدعاء Debug في صفي الخاص وإضافة توجيه المترجم المسبق

public void Debug(string s)
{
#if DEBUG
    System.Diagnostics.Debug(...);
#endif
}

سيؤدي استخدام رمز برنامج التحويل البرمجي DEBUG، كما قلت، إلى حذف الكود من التجميع فعليًا.

أعتقد أن System.Diagnostics.Debug.Write سيتم إخراجه دائمًا إلى مصحح أخطاء مرفق، حتى لو كنت مضمنًا في وضع الإصدار.لكل مقالة MSDN:

يكتب معلومات حول التصحيح إلى مستمعي التتبع في مجموعة المستمعين.

إذا كنت لا تريد أي الإخراج، ستحتاج إلى إنهاء مكالمتك بـ Debug.اكتب باستخدام ثابت DEBUG كما قال Juan:

#if DEBUG
    System.Diagnostics.Debug.Write(...);
#endif

لقد قرأت المقالة أيضًا، وقادني ذلك إلى الاعتقاد أنه عندما لم يتم تعريف DEBUG، فإن الإعلان عن ConditionalAttribute في وظائف System.Debug سيؤدي إلى قيام المترجم بترك هذا الرمز بالكامل.أفترض أن نفس الشيء ينطبق على TRACE.بمعنى، يجب أن تحتوي وظائف System.Diagnostics.Debug على ConditionalAttributes لـ DEBUG وTRACE.لقد كنت مخطئا في هذا الافتراض.تحتوي فئة التتبع المنفصلة على نفس الوظائف، وهي تحدد ConditionalAttribute اعتمادًا على ثابت TRACE.

من System.Diagnostics.Debug:_ الكتابة الفرعية المشتركة العامة (_ رسالة كسلسلة _)

من System.Diagnostics.Trace:_ خط الكتابة الفرعي المشترك العام ( _ رسالة كسلسلة _ )

يبدو بعد ذلك أن افتراضي الأصلي كان صحيحًا، حيث لم يتم تضمين عبارات System.Diagnostics.Debug (أو system.Diagnostics.Trace) في التجميع كما لو تم تضمينها في مناطق #IF DEBUG (أو #IF TRACE).

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

لقد قفزنا من .NET 1.1/VS2003 إلى .NET 3.5/VS2008 لذا أعتقد أن بعضًا من هذا كان يعمل بشكل مختلف، ولكن ربما تغير في 2.0/VS2005.

لتحديد ما إذا كنت تريد تجميع معلومات التصحيح أو إزالتها،

أدخل علامة التبويب "إنشاء" في نافذة خصائص المشروع.

اختر التكوين الصحيح (نشط / إصدار / تصحيح / الكل) وتأكد من أنك تحقق من "ثابت DEBUG" إذا كنت تريد المعلومات ، أو قم بإلغاء تحديده إذا لم تقم بذلك.

تطبيق التغييرات وإعادة البناء

في تجربتي، لا يُحدث الاختيار بين التصحيح والإصدار في VB.NET أي فرق.يمكنك إضافة إجراءات مخصصة إلى كلا التكوينين، ولكن افتراضيًا أعتقد أنهما متماثلان.

من المؤكد أن استخدام الإصدار لن يؤدي إلى إزالة عبارات System.Diagnostics.Debug.Write.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top