Debugger

แก้ไขข้อบกพร่องโปรเจ็กต์ของคุณด้วยโปรแกรมแก้ไขข้อบกพร่อง Visual Studio (LLDB) เมื่อใช้ ส่วนขยายการพัฒนาเกม Android

เรียกใช้โปรแกรมแก้ไขข้อบกพร่อง

ก่อนที่คุณจะเรียกใช้โปรแกรมแก้ไขข้อบกพร่องได้ คุณต้องสร้าง ทำให้ใช้งานได้ และเรียกใช้ เกมบน Android ดูรายละเอียดได้ในส่วนเรียกใช้ตัวอย่าง

เมื่อแน่ใจว่าคุณสามารถเรียกใช้เกมโดยไม่มีโปรแกรมแก้ไขข้อบกพร่องแล้ว คุณสามารถใช้ โปรแกรมแก้ไขข้อบกพร่องโดยกด F5 หรือเลือกรายการเริ่มแก้ไขข้อบกพร่อง ในเมนูแก้ไขข้อบกพร่อง คุณควรเห็นกล่องโต้ตอบขณะแนบโปรแกรมแก้ไขข้อบกพร่อง เกมได้

การเรียกใช้โปรแกรมแก้ไขข้อบกพร่องจะใช้เวลาตั้งแต่ 10 วินาทีถึง 1 นาทีขึ้นไป ขึ้นอยู่กับขนาดแอปพลิเคชันของคุณและจำนวนสัญลักษณ์ที่ต้องการ ให้โหลดเมื่อเริ่มต้นใช้งาน ใช้เวลานานขึ้นเมื่อต่อเข้ากับอุปกรณ์ใหม่สำหรับ เป็นครั้งแรกที่โปรแกรมแก้ไขข้อบกพร่องต้องดาวน์โหลดไลบรารี Android บางส่วนจาก อุปกรณ์ไปยังเครื่องโฮสต์ หากใช้เวลานานกว่า 1 นาทีในครั้งแรก ลองใช้อุปกรณ์ใหม่ 2-3 ครั้ง ให้พิจารณายกเลิกเซสชันการแก้ไขข้อบกพร่องแล้ว รีสตาร์ท

เมื่อคุณเรียกใช้โปรแกรมแก้ไขข้อบกพร่องด้วยวิธีนี้ เกมจะเริ่มต้นในกำลังรอ โปรแกรมแก้ไขข้อบกพร่องและจะไม่เรียกใช้โค้ดของเกมจนกว่า ของคุณ วิธีนี้ทำให้คุณสามารถแก้ไขข้อบกพร่องของส่วนการเริ่มต้นของ เกมของคุณ

คุณดูข้อมูลเพิ่มเติมเกี่ยวกับฟีเจอร์โปรแกรมแก้ไขข้อบกพร่องของ 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 เป็นเลขฐานสิบหกตัวพิมพ์เล็ก

สามารถใช้ตัวระบุรูปแบบได้โดยตรงในหน้าต่างดูหรือใน หน้าต่างรถยนต์, Locals และ DataTip ทำการเพิ่มใน Natvis ได้ นิพจน์ ดูข้อมูลเพิ่มเติมที่ Natvis

รายการตัวระบุการสนับสนุน

ชื่อรูปแบบ ผู้ระบุ คำอธิบาย
บูลีน B แสดงบูลีนนี้เป็นบูลีนจริง/เท็จ โดยใช้กฎจารีตประเพณีที่ว่า 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
เลขฐานสิบ d, i แสดงตัวเลขนี้เป็นตัวเลขจำนวนเต็ม (ไม่ใช่การแคสต์ แต่แสดงไบต์เป็นจำนวนเต็มที่มีเครื่องหมาย)
การแจงนับ E,en แสดงค่านี้เป็นการแจงนับ พิมพ์ชื่อค่า (หากมี) หรือใส่ค่าจำนวนเต็ม
เช่น (enum enumType) val_type = eValue2
เลขฐานสิบหก - ตัวพิมพ์เล็ก x, สูง แสดงข้อมูลนี้ในรูปแบบเลขฐาน 16 ตัวพิมพ์เล็ก (ไม่สามารถแคสต์ได้ แต่แสดงไบต์เป็นเลขฐานสิบหก)
เลขฐานสิบหก - ตัวพิมพ์ใหญ่ X, สูง แสดงข้อมูลนี้ในรูปแบบเลขฐาน 16 ตัวพิมพ์ใหญ่ (ไม่มีการแคสต์ แต่แสดงไบต์เป็นเลขฐาน 16)
เลขฐานสิบหก - ตัวพิมพ์เล็ก ไม่มีเลข 0x นำหน้า xb, hb แสดงข้อมูลนี้ในรูปแบบเลขฐาน 16 ตัวพิมพ์เล็กที่ไม่มีคำนำหน้า 0x (ไม่ทำงานแบบแคสต์ แต่แสดงไบต์เป็นเลขฐานสิบหก)
เลขฐานสิบหก - ตัวพิมพ์ใหญ่ ไม่มี 0x นำหน้า Xb, Hb แสดงข้อมูลนี้ในรูปแบบเลขฐาน 16 ตัวพิมพ์ใหญ่ที่ไม่มีคำนำหน้า 0x (ไม่ใช่การแคสต์ แต่แสดงไบต์เป็นเลขฐาน 16)
float f แสดงตัวเลขนี้เป็นตัวเลขทศนิยม (ไม่ใช่การแคสต์แต่แปลค่าไบต์เป็นค่าจุดลอยตัว IEEE754)
เลขฐาน 8 o แสดงค่านี้ในรูปแบบเลขฐานแปด
ประเภทระบบปฏิบัติการ O แสดงเป็น MacOS OSType
เช่น (ลอย) x = '\n\x1f\xd7\n'
สตริง - ซีสตริง s แสดงเป็นสตริง C ที่มี 0 สิ้นสุด
เช่น "สวัสดีโลก"
string - C-string ไม่มีเครื่องหมายคำพูด sb แสดงเป็นสตริง C ที่มี 0 สิ้นสุดโดยไม่มีเครื่องหมายอัญประกาศ
เช่น สวัสดีโลก
สตริง - UTF-8 S8 แสดงเป็นสตริง UTF-8 ที่มี 0 สิ้นสุด
เช่น u8"สวัสดีโลก ☕"
string - UTF-8, ไม่มีเครื่องหมายคำพูด S8B แสดงเป็นสตริง UTF-8 ที่มี 0 สิ้นสุดโดยไม่มีเครื่องหมายคำพูด
เช่น สวัสดีชาวโลก ☕
สตริง - UTF-16 su แสดงเป็นสตริง UTF-16 ที่มี 0 สิ้นสุด
เช่น "สวัสดีทุกคนค่ะ ☕"
string - UTF-16, ไม่มีเครื่องหมายคำพูด ย่อย แสดงเป็นสตริง UTF-16 ที่สิ้นสุดเป็น 0 โดยไม่มีเครื่องหมายอัญประกาศ
เช่น สวัสดีชาวโลก ☕
สตริง - UTF-32 S32 แสดงเป็นสตริง UTF-32 ที่มี 0 สิ้นสุด
เช่น "สวัสดีทุกคนค่ะ 🏠"
string - UTF-32, ไม่มีเครื่องหมายคำพูด S32B แสดงเป็นสตริง UTF-32 ที่สิ้นสุดเป็น 0 โดยไม่มีเครื่องหมายอัญประกาศ
เช่น สวัสดีชาวโลก ☕
Unicode16 U แสดงอักขระ UTF-16
เช่น (ทศนิยม) x = 0xd70a 0x411f
Unicode32 U32 แสดงอักขระ UTF-32
เช่น (ทศนิยม) x = 0x411fd70a
ทศนิยมที่ไม่มีเครื่องหมาย u แสดงตัวเลขนี้เป็นตัวเลขจำนวนเต็มที่ไม่มีเครื่องหมาย (ไม่ใช่การแคสต์ แต่แสดงไบต์เป็นจำนวนเต็มที่ไม่มีเครื่องหมาย)
Pointer p แสดงเป็นตัวชี้เนทีฟ (เว้นแต่ว่าจะเป็นตัวชี้จริงๆ ที่อยู่ผลลัพธ์อาจไม่ถูกต้อง)
จำนวนเต็มเชิงซ้อน I ตีความค่านี้ว่าเป็นส่วนจริงและส่วนจินตภาพของจำนวนเต็มเชิงซ้อน
เช่น (int *) ตัวชี้ = 1048960 + 1i
อาร์เรย์อักขระ a แสดงเป็นอาร์เรย์อักขระ
เช่น (อักขระ) *c.sp.z = {X}
แบบข้อมูลดิบ ! รูปแบบข้อมูลดิบ โดยไม่คำนึงถึงการปรับแต่งมุมมองประเภทข้อมูลใดๆ

แนทวิส

เฟรมเวิร์ก Natvis ช่วยให้คุณสามารถปรับแต่งวิธีแสดง Visual Studio ได้ ประเภทเนทีฟในหน้าต่างตัวแปรของโปรแกรมแก้ไขข้อบกพร่อง เช่น ใช้ Natvis เพื่อ ปรับแต่งการแสดงผลสำหรับหน้าต่างนาฬิกา ในเครื่อง และเคล็ดลับในการใช้ข้อมูล

ฟีเจอร์ Natvis เปิดใช้อยู่โดยค่าเริ่มต้นแต่ปิดใช้ได้จาก Visual Studio โดยตั้งค่า เครื่องมือ > ตัวเลือก > ส่วนขยายการพัฒนาเกม Android > แนทวิส แจ้งเป็นปิดใช้

กำลังโหลดไฟล์ Natvis

Visual Studio จะโหลดไฟล์ Natvis จากตำแหน่ง 3 ตำแหน่งที่ระบุด้านล่าง และ โหลดซ้ำทุกครั้งที่คุณเริ่มเซสชันการแก้ไขข้อบกพร่อง ไฟล์ต้องเป็นไปตาม สคีมา Natvis ของ Visual Studio 2017

  • .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

ในบางกรณี ข้อผิดพลาดจะแสดงเป็นค่าของตัวแปร (เช่น ใน หน้าต่างอัตโนมัติ, นาฬิกา ฯลฯ) เช่น <error: use of undeclared identifier 'missingVar'>

คุณเข้าถึงรายละเอียดเพิ่มเติมเกี่ยวกับข้อผิดพลาดได้โดยเปิด GoogleAndroid.log จากแถบเครื่องมือส่วนขยายการพัฒนาเกม Android

ข้อจำกัดที่ทราบ

  • หากแท็กหรือแอตทริบิวต์ของคุณไม่อยู่ในไฟล์ตัวอย่างด้านบน แสดงว่า สนับสนุนอยู่ในปัจจุบัน Visual Studio จะไม่สนใจแท็กและแอตทริบิวต์ที่ไม่รองรับ ดังนั้น คุณสามารถปล่อยให้พวกเขาอยู่ในไฟล์ Natvis ที่มีอยู่ ไฟล์ จะยังคงใช้งานได้ โดยใช้สคีมาของเรา

  • แอตทริบิวต์ Usage จะใช้ไม่ได้กับสคีมา <SmartPointer> อย่างไรก็ตาม LLDB ไม่ได้จำกัดการเข้าถึงโอเปอเรเตอร์ กำหนดไว้ใน C++ เพื่อให้สามารถกำหนดโอเปอเรเตอร์ที่จำเป็นใน C++ แทน