แก้ไขข้อบกพร่องโปรเจ็กต์ของคุณด้วยโปรแกรมแก้ไขข้อบกพร่อง Visual Studio (LLDB) เมื่อใช้ ส่วนขยายการพัฒนาเกม Android
เรียกใช้โปรแกรมแก้ไขข้อบกพร่อง
ก่อนที่คุณจะเรียกใช้โปรแกรมแก้ไขข้อบกพร่องได้ คุณต้องสร้าง ทำให้ใช้งานได้ และเรียกใช้ เกมบน Android ดูรายละเอียดได้ในส่วนเรียกใช้ตัวอย่าง
เมื่อแน่ใจว่าคุณสามารถเรียกใช้เกมโดยไม่มีโปรแกรมแก้ไขข้อบกพร่องแล้ว คุณสามารถใช้ โปรแกรมแก้ไขข้อบกพร่องโดยกด F5 หรือเลือกรายการเริ่มแก้ไขข้อบกพร่อง ในเมนูแก้ไขข้อบกพร่อง คุณควรเห็นกล่องโต้ตอบขณะแนบโปรแกรมแก้ไขข้อบกพร่อง เกมได้
การเรียกใช้โปรแกรมแก้ไขข้อบกพร่องจะใช้เวลาตั้งแต่ 10 วินาทีถึง 1 นาทีขึ้นไป ขึ้นอยู่กับขนาดแอปพลิเคชันของคุณและจำนวนสัญลักษณ์ที่ต้องการ ให้โหลดเมื่อเริ่มต้นใช้งาน ใช้เวลานานขึ้นเมื่อต่อเข้ากับอุปกรณ์ใหม่สำหรับ เป็นครั้งแรกที่โปรแกรมแก้ไขข้อบกพร่องต้องดาวน์โหลดไลบรารี Android บางส่วนจาก อุปกรณ์ไปยังเครื่องโฮสต์ หากใช้เวลานานกว่า 1 นาทีในครั้งแรก ลองใช้อุปกรณ์ใหม่ 2-3 ครั้ง ให้พิจารณายกเลิกเซสชันการแก้ไขข้อบกพร่องแล้ว รีสตาร์ท
เมื่อคุณเรียกใช้โปรแกรมแก้ไขข้อบกพร่องด้วยวิธีนี้ เกมจะเริ่มต้นในกำลังรอ โปรแกรมแก้ไขข้อบกพร่องและจะไม่เรียกใช้โค้ดของเกมจนกว่า ของคุณ วิธีนี้ทำให้คุณสามารถแก้ไขข้อบกพร่องของส่วนการเริ่มต้นของ เกมของคุณ
คุณดูข้อมูลเพิ่มเติมเกี่ยวกับฟีเจอร์โปรแกรมแก้ไขข้อบกพร่องของ Visual Studio ที่เฉพาะเจาะจงได้โดยทำดังนี้ อ่านเอกสารประกอบของ Visual Studio
การแนบกับกระบวนการ
หากต้องการแก้ไขข้อบกพร่องของเกมที่กำลังใช้งานอยู่บนอุปกรณ์จริงหรือเสมือนอยู่แล้ว คุณสามารถแนบโปรแกรมแก้ไขข้อบกพร่องกับกระบวนการจาก Visual Studio ได้
ใน Visual Studio ให้ตรวจสอบว่าโซลูชัน Android เปิดอยู่ และทำดังนี้
- ไปที่เมนูแก้ไขข้อบกพร่องแล้วเลือกแนบกับกระบวนการ...
- จากเมนูแบบเลื่อนลงการส่ง ให้เลือกส่วนขยายการพัฒนาเกม Android
- เลือกอุปกรณ์ Android จากเมนูแบบเลื่อนลงตัวขยาย
- เลือกกระบวนการของเกมจากรายการกระบวนการที่มีอยู่และ คลิกแนบ
การเรียกใช้คำสั่ง 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<*>">
<AlternativeType Name="MySimilarVectorType<*>"/>
<!-- 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 < 4 && _size >= 1" Optional="true">_items[0]</Item>
<Item Name="Y" Condition="_size < 4 && _size >= 2" Optional="true">_items[1]</Item>
<Item Name="Z" Condition="_size < 4 && _size >= 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++ แทน