برنامج تصحيح الأخطاء

يمكنك تصحيح الأخطاء في مشروعك باستخدام Visual Studio Debugger (LLDB) عند استخدام إضافة تطوير الألعاب لنظام Android

تشغيل برنامج تصحيح الأخطاء

لكي تتمكّن من تشغيل برنامج تصحيح الأخطاء، يجب أن تكون قادرًا على إنشاء ونشر وتشغيل اللعبة على Android. راجِع القسم تشغيل النموذج لمعرفة التفاصيل.

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

يستغرق تشغيل برنامج تصحيح الأخطاء مدة تتراوح بين 10 ثوانٍ ودقيقة واحدة أو أكثر. اعتمادًا على حجم التطبيق وعدد الرموز التي يحتاج إليها ليتم تحميله عند بدء التشغيل. يستغرق الأمر وقتًا أطول عند التوصيل بجهاز جديد هو المرة الأولى التي يضطر فيها برنامج تصحيح الأخطاء إلى تنزيل بعض مكتبات Android من الجهاز إلى الجهاز المضيف. إذا استغرقت أكثر من دقيقة واحدة في أول دقيقة، بضع محاولات باستخدام جهاز جديد، ففكِّر في إلغاء جلسة تصحيح الأخطاء ثم إعادة تشغيله.

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

يمكنك العثور على مزيد من المعلومات حول ميزات محدّدة في برنامج تصحيح الأخطاء في Visual Studio من خلال قراءة وثائق Visual Studio.

إرفاق العملية

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

في Visual Studio، تأكَّد من فتح حل Android و:

  1. انتقِل إلى قائمة تصحيح الأخطاء واختَر إرفاق بالمعالجة....
  2. من القائمة المنسدلة النقل، اختَر إضافة تطوير ألعاب Android.
  3. من القائمة المنسدلة المؤهل، اختَر جهاز Android.
  4. حدد عملية اللعبة من قائمة العمليات المتاحة انقر على إرفاق.

الإرفاق بالعملية

تنفيذ أوامر LLDB.Shell

بعد تفعيل جلسة تصحيح الأخطاء، استخدِم نافذة الأوامر في Visual Studio أوامر LLDB.Shell.

تنسيق الأمر:

LLDB.Shell [command]

مثال:

>LLDB.Shell expr myIntVariable = 9
Status:  Success
Output Message:
(int) $2 = 9

تصور البيانات

محددات التنسيق

يمكنك تغيير التنسيق الذي يتم فيه عرض القيمة في السيارات، نوافذ Locals وWatch ومتغيرة DataTip باستخدام محددات التنسيقات.

يمكن العثور على محددات التنسيق في نهاية التعبيرات. تبدأ بفاصلة متبوعة بسلسلة قصيرة. على سبيل المثال، محدّد ,x في _myInt,x تعبيرًا على تنسيق myInt كقيمة سداسية عشرية صغيرة.

يمكن استخدام محددات التنسيق مباشرةً في نافذة مشاهدة أو في نوافذ Autos وLocals وDataTip من خلال إضافتها إلى Natvis والتعبيرات. يمكنك الاطّلاع على Natvis للحصول على مزيد من المعلومات.

قائمة محددات الدعم

اسم التنسيق المحدِّد(المحددات) الوصف
منطقية B لإظهار ذلك كقيمة منطقية true/false، باستخدام القاعدة الاعتيادية التي تفيد بأن 0 هو 0 وكل شيء آخر صواب
برنامج ثنائي b لإظهار ذلك في شكل سلسلة من البتات
ثنائي، بدون 0b بادئة بب إظهار ذلك في صورة متتابعة من وحدات البت بدون البادئة 0b
بايت y تُظهر وحدات البايت، ولكن حاول عرضها كأحرف ASCII كذلك
على سبيل المثال. (int *) c.sp.x = 50 f8 bf 5f ff 7f 00 00 P.._....
بايت مع ASCII Y تُظهر وحدات البايت، ولكن حاول عرضها كأحرف ASCII كذلك
على سبيل المثال. (int *) c.sp.x = 50 f8 bf 5f ff 7f 00 00 P.._....
حرف c إظهار وحدات البايت كأحرف ASCII
مثال (int *) c.sp.x = P\xf8\xbf_\xff\x7f\0\0
حرف قابل للطباعة C إظهار وحدات البايت كأحرف ASCII قابلة للطباعة
على سبيل المثال: (int *) c.sp.x = P.._....
عدد فاصل عائم F تفسير هذه القيمة باعتبارها جزءًا حقيقيًا وتخيّليًا لعدد مركّب من النقاط العائمة
على سبيل المثال (int *) c.sp.x = 2.76658e+19 + 4.59163e-41i
علامة عشرية د، ط إظهار ذلك كعدد صحيح بعلامة (هذا لا يؤدي إلى عملية إرسال، إنه يعرض فقط وحدات البايت كعدد صحيح بعلامة)
التعداد E,en إظهار ذلك كتعداد، طباعة اسم القيمة في حال توفّره أو قيمة العدد الصحيح، بخلاف ذلك
مثال: (enum enumType) val_type = eValue2
سداسي عشري - أحرف صغيرة x، h إظهار ذلك بتدوين سداسي عشري بأحرف صغيرة (هذا لا يؤدي إلى إرسال، بل يعرض وحدات البايت في شكل ست عشري)
نظام سداسي عشري - كبير X، H إظهار ذلك بتدوين سداسي عشري بأحرف كبيرة (لا يؤدي هذا إلى إرسال المحتوى، بل يُظهر وحدات البايت في شكل ست عشري)
ست عشري - حالة صغيرة، بدون 0x في البداية xb، hb إظهار ذلك بتدوين سداسي عشري صغير بدون بادئة 0x (لا يؤدي هذا إلى التحويل، بل يعرض وحدات البايت على هيئة سداسية عشرية)
نظام سداسي عشري - أحرف كبيرة، بدون 0x في البداية Xb وHb إظهار ذلك بتدوين سداسي عشري بأحرف كبيرة بدون البادئة 0x (لا يؤدي هذا إلى إرسال المحتوى، بل يعرض وحدات البايت على شكل سداسي عشري)
عائم f إظهار هذا كرقم نقطة عائمة (هذا لا يؤدي إلى إرسال، بل يفسر فقط وحدات البايت كقيمة نقطة عائمة لـ IEEE754)
النظام الثماني o إظهار ذلك في الترميز الثماني
نوع نظام التشغيل O عرض هذا على أنه MacOS OSType
على سبيل المثال. (عائم) x = '\n\x1f\xd7\n'
سلسلة - سلسلة C s إظهار هذا كسلسلة C منتهية الصلاحية 0
على سبيل المثال. "مرحبًا بالعالم"
سلسلة - سلسلة C، بدون علامات اقتباس sb إظهار ذلك كسلسلة C بإنهاءها 0 بدون علامات اقتباس،
مثال: أهلاً بالعالم
سلسلة - UTF-8 مقاس 8 عرض ذلك كسلسلة UTF-8 تم إنهاؤها 0
على سبيل المثال. u8"أهلاً بالعالم ✏"
سلسلة - UTF-8، بدون علامات اقتباس s8b عرض ذلك كسلسلة UTF-8 تم إنهاؤها 0 بدون علامة اقتباس
على سبيل المثال، مرحبًا بالعالم 👏
سلسلة - UTF-16 سو عرض ذلك كسلسلة UTF-16 تم إنهاؤها 0
على سبيل المثال. u"hello world 🥳
سلسلة - UTF-16، بدون علامات اقتباس sub عرض ذلك كسلسلة UTF-16 تم إنهاؤها 0 بدون علامات اقتباس
على سبيل المثال. مرحبًا بالعالم 👏
سلسلة - UTF-32 خادم s32 عرض ذلك كسلسلة UTF-32 تم إنهاؤها 0
على سبيل المثال. "أهلاً بالعالم 🥳
سلسلة - UTF-32، بدون علامات اقتباس s32b عرض ذلك كسلسلة UTF-32 التي تم إنهاؤها 0 بدون علامات اقتباس
على سبيل المثال. مرحبًا بالعالم 👏
يونيكود16 U إظهار ذلك كأحرف UTF-16
على سبيل المثال، (عائم) x = 0xd70a 0x411f
يونيكود32 U32 إظهار ذلك كأحرف UTF-32
على سبيل المثال، (عائم) x = 0x411fd70a
علامة عشرية بلا علامة u إظهار ذلك كعدد صحيح غير موقع (هذا لا يؤدي إرسالًا، بل يعرض فقط وحدات البايت كعدد صحيح غير موقَّع)
مؤشر p إظهار هذا كمؤشر أصلي (ما لم يكن هذا مؤشرًا بالفعل، فمن المحتمل أن يكون العنوان الناتج غير صالح)
عدد صحيح معقد I تفسير هذه القيمة على أنّها الجزء الحقيقي والتخيلي لعدد صحيح مركّب
على سبيل المثال (int *) المؤشر = 1048960 + 1i
مصفوفة الأحرف a إظهار ذلك كمصفوفة من الأحرف
على سبيل المثال. (char) *c.sp.z = {X}
عرض أوّلي ! تنسيق أولي، ويتجاهل أي تخصيص لطرق عرض نوع البيانات

ناتفيس

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

ميزة Natvis مفعَّلة تلقائيًا ولكن يمكن إيقافها من Visual Studio عن طريق ضبط الأدوات > الخيارات > إضافة تطوير ألعاب Android > ناتفيس قُم بـ غير مفعَّل.

تحميل ملفات Natvis

تحمِّل Visual Studio ملفات Natvis من المواقع الثلاثة المدرجة أدناه يعيد تحميلها في كل مرة تبدأ فيها جلسة تصحيح الأخطاء. يجب أن تتقيّد الملفات مخطط Visual Studio 2017 Natvis.

  • .natvis ملفات التي تشكل جزءًا من مشروع تم تحميله أو عنصر حل من المستوى الأعلى.
  • الدليل الخاص بالمستخدم (%USERPROFILE%\Documents\Visual Studio 2017\Visualizers)
  • الدليل على مستوى النظام (%VSINSTALLDIR%\Common7\Packages\Debugger\Visualizers)
إعادة تحميل ملفات Natvis

يمكنك إعادة تحميل ملفات Natvis خلال جلسة تصحيح الأخطاء من خلال تقييم .natvisreload في نافذة الأوامر أو نافذة المشاهدة

نموذج ملف Natvis

يتضمن نموذج ملف Natvis هذا جميع العلامات والسمات المتوفرة حاليًا

<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">

  <Type Name="demo::Vector&lt;*&gt;">
    <AlternativeType Name="MySimilarVectorType&lt;*&gt;"/>

    <!-- Included to show the <SmartPointer> feature is supported. -->
    <SmartPointer Optional="true" Usage="Minimal">ptr</SmartPointer>

    <!-- Included to show the <DisplayString> feature is supported. -->
    <DisplayString Condition="_size == 0" Optional="true">()</DisplayString>
    <DisplayString Condition="_size == 1">(x={_items[0]})</DisplayString>
    <DisplayString Condition="_size == 2">(x={_items[0]}, y={_items[1]})</DisplayString>
    <DisplayString Condition="_size == 3">(x={_items[0]}, y={_items[1]}, z={_items[2]})</DisplayString>
    <DisplayString>[Size={_size,x}] (x={_items[0]}, y={_items[1]}, z={_items[2]}, ...)</DisplayString>

    <!-- Included to show the <StringView> feature is supported. -->
    <StringView Condition="true" Optional="true">_stringViewText</StringView>

    <Expand HideRawView="false">
      <!-- Included to show the <Item> feature is supported. -->
      <Item Name="X" Condition="_size &lt; 4 &amp;&amp; _size &gt;= 1" Optional="true">_items[0]</Item>
      <Item Name="Y" Condition="_size &lt; 4 &amp;&amp; _size &gt;= 2" Optional="true">_items[1]</Item>
      <Item Name="Z" Condition="_size &lt; 4 &amp;&amp; _size &gt;= 3" Optional="true">_items[2]</Item>

      <!-- Included to show the <ArrayItems> feature is supported. -->
      <ArrayItems Condition="_size >= 4" Optional="true">
        <Size Condition="true" Optional="true">_size</Size>
        <ValuePointer Condition="true">_items</ValuePointer>
      </ArrayItems>

      <!-- Included to show the <IndexListItems> feature is supported. -->
      <IndexListItems Condition="true" Optional="true">
        <Size Condition="true" Optional="true">_listSize</Size>
        <ValueNode Condition="true">_list[%i]</ValueNode>
      </IndexListItems>

      <!-- Included to show the <LinkedListItems> feature is supported. -->
      <LinkedListItems Condition="true" Optional="true">
        <Size Optional="true">_listSize</Size>
        <HeadPointer>_head</HeadPointer>
        <NextPointer>_next</NextPointer>
        <ValueNode>_value</ValueNode>
      </LinkedListItems>

      <!-- Included to show the <ExpandedItem> feature is supported. -->
      <ExpandedItem Condition="true" Optional="true">_childVar</ExpandedItem>

      <!-- Included to show the <Synthetic> feature is supported. -->
      <Synthetic Name="[Size]" Condition="true" Optional="true">
        <DisplayString>_size</DisplayString>
        <Expand HideRawView="true">
          <!-- Any supported <Expand> sub-tags. -->
        </Expand>
      </Synthetic>

      <!-- Included to show the <TreeItems> feature is supported. -->
      <TreeItems Condition="true" Optional="true">
        <Size>_treeSize</Size>
        <HeadPointer>_head</HeadPointer>
        <LeftPointer>_left</LeftPointer>
        <RightPointer>_right</RightPointer>
        <ValueNode>_value</ValueNode>
      </TreeItems>

      <!-- Included to show format specifiers are supported. -->
      <Item Name="[Hex Dump at {_index,x}]">myInt[_index],x</Item>
    </Expand>
  </Type>
</AutoVisualizer>

تأليف ملفات Natvis

تتيح لك Visual Studio تأليف ملفات Natvis. لمزيد من المعلومات عن تخصيص نوافذ متغير برنامج تصحيح الأخطاء، يُرجى مراجعة MSDN:

تصحيح أخطاء ملفات Natvis

في بعض الحالات، ستظهر الأخطاء على أنّها قيمة متغيّر (على سبيل المثال، في نوافذ Auto ومشاهدة وما إلى ذلك). مثلاً: <error: use of undeclared identifier 'missingVar'>

يمكنك الوصول إلى مزيد من التفاصيل حول الخطأ من خلال فتح GoogleAndroid.log. من شريط أدوات إضافة تطوير ألعاب Android.

القيود المعروفة

  • إذا لم تكن علامتك أو السمة مُدرَجة في نموذج الملف أعلاه، المدعومة حاليًا. تتجاهل Visual Studio العلامات والسمات غير المتوافقة، يمكنك تركها في ملف Natvis الحالي وسيظل الملف صالحًا، طالما فإنها تستخدم مخططنا.

  • إنّ السمة Usage غير متوافقة مع المخطّط، على الرغم من أنّ المخطط يطلبها. <SmartPointer> ومع ذلك، لا يقيّد LLDB الوصول إلى عوامل التشغيل في C++، بحيث يمكن تحديد أي عامل تشغيل مطلوب في C++ بدلاً من ذلك.