NK-GDB

NDK มีสคริปต์เชลล์ชื่อ ndk-gdb เพื่อเริ่มเซสชันการแก้ไขข้อบกพร่องแบบเนทีฟของบรรทัดคำสั่ง (เดิมคือ gdb แต่ตอนนี้เป็น lldb) ผู้ใช้ที่ต้องการใช้ GUI ควรอ่านเอกสารประกอบเกี่ยวกับการแก้ไขข้อบกพร่องใน Android Studio แทน

ข้อกำหนด

คุณต้องปฏิบัติตามข้อกําหนดต่อไปนี้เพื่อให้การแก้ไขข้อบกพร่องแบบเนทีฟของบรรทัดคําสั่งทํางานได้

  • สร้างแอปโดยใช้สคริปต์ ndk-build สคริปต์ ndk-gdb ไม่รองรับการใช้เมธอด make APP=<name> แบบเดิมในการสร้าง
  • เปิดใช้การแก้ไขข้อบกพร่องของแอปในไฟล์ AndroidManifest.xml โดยใส่องค์ประกอบ <application> ที่กำหนดแอตทริบิวต์ android:debuggable เป็น true
  • บิลด์แอปให้ทำงานบน Android 2.2 (Android API ระดับ 8) ขึ้นไป
  • แก้ไขข้อบกพร่องในอุปกรณ์หรือโปรแกรมจำลองที่ใช้ Android 2.2 ขึ้นไป ระดับ API เป้าหมายที่คุณประกาศในไฟล์ AndroidManifest.xml จะไม่ส่งผลต่อการแก้ไขข้อบกพร่อง
  • พัฒนาแอปในเชลล์ Unix ใน Windows ให้ใช้ Cygwin หรือการใช้งาน ndk-gdb-py Python เวอร์ชันทดลอง
  • ใช้ GNU Make 3.81 ขึ้นไป

การใช้งาน

หากต้องการเรียกใช้สคริปต์ ndk-gdb ให้เปลี่ยนเป็นไดเรกทอรีแอปพลิเคชันหรือไดเรกทอรีใดก็ได้ที่อยู่ภายใต้ไดเรกทอรีนั้น เช่น

cd $PROJECT
$NDK/ndk-gdb

ในที่นี้ $PROJECT จะชี้ไปยังไดเรกทอรีรูทของโปรเจ็กต์ และ $NDK จะชี้ไปยังเส้นทางการติดตั้ง NDK

เมื่อเรียกใช้ ndk-gdb ระบบจะกําหนดค่าเซสชันให้ค้นหาไฟล์ต้นฉบับและสัญลักษณ์/เวอร์ชันแก้ไขข้อบกพร่องของไลบรารีเนทีฟที่สร้างขึ้น เมื่อแนบกับกระบวนการสมัครเรียบร้อยแล้ว ndk-gdb จะแสดงข้อความแสดงข้อผิดพลาดจำนวนมาก โดยระบุว่าไม่พบคลังระบบต่างๆ กรณีนี้เป็นเรื่องปกติ เนื่องจากเครื่องโฮสต์ไม่มีไลบรารีเหล่านี้ในเวอร์ชันสัญลักษณ์/แก้ไขข้อบกพร่องในอุปกรณ์เป้าหมาย คุณไม่จำเป็นต้องสนใจข้อความเหล่านี้และจะไม่ส่งผลเสียหายใดๆ

จากนั้น ndk-gdb จะแสดงพรอมต์ lldb ตามปกติ

คุณโต้ตอบกับ ndk-gdb ได้เช่นเดียวกับที่โต้ตอบกับ lldb ดู [แผนที่คำสั่ง GDB ไปยัง LLDB](https://lldb.llvm.org/use/map.html) ที่มีประโยชน์หากคุณไม่คุ้นเคยกับ lldb แต่รู้จัก gdb

ndk-gdb จะจัดการกับเงื่อนไขข้อผิดพลาดหลายรายการ และแสดงข้อความแสดงข้อผิดพลาดที่เป็นประโยชน์หากพบปัญหา การตรวจสอบเหล่านี้รวมถึงการตรวจสอบว่าเงื่อนไขต่อไปนี้เป็นไปตามข้อกำหนดหรือไม่

  • ตรวจสอบว่า ADB อยู่ในเส้นทางของคุณ
  • ตรวจสอบว่าแอปพลิเคชันของคุณประกาศว่าแก้ไขข้อบกพร่องได้ในไฟล์ Manifest
  • ตรวจสอบว่าแอปพลิเคชันที่ติดตั้งซึ่งมีชื่อแพ็กเกจเดียวกันในอุปกรณ์นั้นแก้ไขข้อบกพร่องได้เช่นกัน

โดยค่าเริ่มต้น ndk-gdb จะค้นหากระบวนการสมัครที่ทำงานอยู่และแสดงข้อผิดพลาดหากไม่พบ อย่างไรก็ตาม คุณสามารถใช้ตัวเลือก --start หรือ --launch=<name> เพื่อเริ่มกิจกรรมโดยอัตโนมัติก่อนเซสชันการแก้ไขข้อบกพร่องได้ ดูข้อมูลเพิ่มเติมได้ที่ตัวเลือก

ตัวเลือก

หากต้องการดูรายการตัวเลือกทั้งหมด ให้พิมพ์ ndk-gdb --help ในบรรทัดคำสั่ง ตารางที่ 1 แสดงรายการที่พบบ่อยพร้อมคําอธิบายสั้นๆ

ตารางที่ 1 ตัวเลือก ndk-gdb ทั่วไปและคําอธิบาย

การเริ่มต้น ndk-gdb ด้วยตัวเลือกนี้ที่ระบุจะเปิดใช้งานกิจกรรมที่เปิดใช้ได้รายการแรกในไฟล์ Manifest ของแอปพลิเคชัน ใช้ --launch=<name> เพื่อเริ่มกิจกรรมถัดไปที่เปิดใช้ได้ หากต้องการแสดงรายการกิจกรรมที่เปิดได้ ให้เรียกใช้ --launch-list จากบรรทัดคำสั่ง

ตัวเลือก คําอธิบาย>
--verbose

ตัวเลือกนี้จะบอกให้ระบบบิลด์พิมพ์ข้อมูลแบบละเอียดเกี่ยวกับการตั้งค่าเซสชันการแก้ไขข้อบกพร่องแบบเนทีฟ ไฟล์นี้จำเป็นเฉพาะในกรณีที่ต้องแก้ไขข้อบกพร่องเมื่อโปรแกรมแก้ไขข้อบกพร่องเชื่อมต่อกับแอปไม่ได้ และข้อความแสดงข้อผิดพลาดที่ ndk-gdb แสดงไม่เพียงพอ

--force โดยค่าเริ่มต้น ndk-gdb จะหยุดดำเนินการหากพบว่ามีเซสชันการแก้ไขข้อบกพร่องแบบเนทีฟอื่นทำงานอยู่ในอุปกรณ์เดียวกัน ตัวเลือกนี้จะปิดเซสชันอื่นและแทนที่ด้วยเซสชันใหม่ โปรดทราบว่าตัวเลือกนี้จะไม่หยุดแอปจริงที่กำลังแก้ไขข้อบกพร่อง ซึ่งคุณต้องหยุดแยกต่างหาก
--start

เมื่อคุณเริ่ม ndk-gdb ระบบจะพยายามแนบกับอินสแตนซ์ที่ทำงานอยู่ของแอปคุณบนอุปกรณ์เป้าหมายโดยค่าเริ่มต้น คุณลบล้างลักษณะการทำงานเริ่มต้นนี้ได้โดยใช้ --start เพื่อเปิดแอปพลิเคชันในอุปกรณ์เป้าหมายก่อนเซสชันการแก้ไขข้อบกพร่องอย่างชัดเจน

--launch=<name>

ตัวเลือกนี้คล้ายกับ --start ยกเว้นว่าตัวเลือกนี้ช่วยให้คุณเริ่มกิจกรรมที่เฉพาะเจาะจงจากแอปพลิเคชันได้ ฟีเจอร์นี้จะมีประโยชน์ก็ต่อเมื่อไฟล์ Manifest ของคุณกำหนดกิจกรรมที่เปิดใช้ได้หลายรายการ

--launch-list

ตัวเลือกที่สะดวกนี้จะพิมพ์รายการชื่อกิจกรรมที่เปิดใช้ได้ทั้งหมดซึ่งพบในไฟล์ Manifest ของแอป --start ใช้ชื่อกิจกรรมแรก

--project=<path> ตัวเลือกนี้จะระบุไดเรกทอรีโปรเจ็กต์แอป ซึ่งมีประโยชน์หากคุณต้องการเปิดสคริปต์โดยไม่ต้องเปลี่ยนเป็นไดเรกทอรีโปรเจ็กต์ก่อน
--port=<port>

โดยค่าเริ่มต้น ndk-gdb จะใช้พอร์ต TCP 5039 ในพื้นที่เพื่อสื่อสารกับแอปที่ทำการแก้ไขข้อบกพร่องในอุปกรณ์เป้าหมาย การใช้พอร์ตอื่นช่วยให้คุณแก้ไขข้อบกพร่องของโปรแกรมที่ทำงานบนอุปกรณ์หรือโปรแกรมจำลองต่างๆ ที่เชื่อมต่อกับเครื่องโฮสต์เครื่องเดียวกันได้

--adb=<file>

ตัวเลือกนี้จะระบุไฟล์ปฏิบัติการของเครื่องมือ adb คุณจำเป็นต้องระบุเฉพาะในกรณีที่ไม่ได้ตั้งค่าเส้นทางให้รวมไฟล์ปฏิบัติการนั้น

  • -d
  • -e
  • -s <serial>
  • Flag เหล่านี้คล้ายกับคำสั่ง adb ที่มีชื่อเดียวกัน ตั้งค่า Flag เหล่านี้หากคุณมีอุปกรณ์หรือโปรแกรมจำลองหลายเครื่องที่เชื่อมต่อกับเครื่องโฮสต์ โดยมีความหมายดังนี้

    -d
    เชื่อมต่อกับอุปกรณ์จริงเครื่องเดียว
    -e
    เชื่อมต่อกับอุปกรณ์โปรแกรมจำลองเครื่องเดียว
    -s <serial>
    เชื่อมต่อกับอุปกรณ์หรือโปรแกรมจำลองที่เฉพาะเจาะจง ในที่นี้ <serial> คือชื่อของอุปกรณ์ตามที่แสดงโดยคำสั่ง adb devices

    หรือจะกําหนดตัวแปรสภาพแวดล้อม ADB_SERIAL เพื่อแสดงอุปกรณ์ที่เฉพาะเจาะจงโดยไม่ต้องใช้ตัวเลือกที่เฉพาะเจาะจงก็ได้

  • --exec=<file>
  • -x <file>
  • ตัวเลือกนี้จะบอก ndk-gdb ให้เรียกใช้คำสั่งเริ่มต้นโปรแกรมแก้ไขข้อบกพร่องที่อยู่ใน <file> หลังจากเชื่อมต่อกับกระบวนการที่แก้ไขข้อบกพร่อง ฟีเจอร์นี้มีประโยชน์ในกรณีที่คุณต้องการทำสิ่งใดซ้ำๆ เช่น การตั้งค่ารายการจุดหยุดพัก แล้วดำเนินการต่อโดยอัตโนมัติ

    --nowait

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

    --tui -t

    เปิดใช้อินเทอร์เฟซผู้ใช้แบบข้อความ (หากมี)

    --gnumake-flag=<flag>

    ตัวเลือกนี้เป็น Flag (หรือ Flag) เพิ่มเติมที่จะส่งไปยังระบบ ndk-build เมื่อสอบถามข้อมูลโปรเจ็กต์ คุณใช้อินสแตนซ์ของตัวเลือกนี้หลายรายการในคําสั่งเดียวกันได้

    หมายเหตุ: ตัวเลือก 3 รายการสุดท้ายในตารางนี้มีไว้สำหรับ ndk-gdb เวอร์ชัน Python เท่านั้น