NK-GDB

NDK มีสคริปต์เชลล์ชื่อ ndk-gdb เพื่อเริ่มต้น เซสชันการแก้ไขข้อบกพร่องดั้งเดิมของบรรทัดคำสั่ง ผู้ใช้ที่ต้องการใช้ 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 Shell ใช้ Cygwin ใน Windows หรือ ndk-gdb-py Python เวอร์ชันทดลอง การใช้งานของคุณ
  • ใช้ GNU Make 3.81 หรือสูงกว่า

การใช้งาน

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

cd $PROJECT
$NDK/ndk-gdb

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

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

จากนั้น ndk-gdb จะแสดงข้อความแจ้ง GDB ปกติ

คุณโต้ตอบกับ ndk-gdb ในลักษณะเดียวกับที่ทำกับ GNU GDB ตัวอย่างเช่น คุณสามารถ ใช้ b <location> เพื่อตั้งค่าเบรกพอยท์ และใช้ c (สำหรับ "ต่อไป") เป็น ดำเนินการต่อ ดูรายการคำสั่งทั้งหมดได้ที่ คู่มือ GDB หากคุณต้องการใช้ โปรแกรมแก้ไขข้อบกพร่อง LLDB ให้ใช้ --lldb เมื่อเรียกใช้สคริปต์ ndk-gdb

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

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

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

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

ตัวเลือก

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

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

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

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

หากตั้งค่าไว้ สคริปต์จะใช้ดีบักเกอร์ LLDB สำหรับเซสชันแทน gdb

--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>
  • แฟล็กเหล่านี้คล้ายกับคำสั่ง adb ที่มีชื่อเดียวกัน ตั้งค่าสถานะเหล่านี้หากคุณมี อุปกรณ์หรือโปรแกรมจำลองต่างๆ ที่เชื่อมต่อกับเครื่องโฮสต์ ซึ่งมีความหมายดังนี้

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

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

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

    --nowait

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

    --tui -t

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

    --gnumake-flag=<flag>

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

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

    การรองรับชุดข้อความ

    หากแอปทำงานบนแพลตฟอร์มที่เก่ากว่า Android 2.3 (API ระดับ 9) ndk-gdb ไม่สามารถแก้ไขข้อบกพร่องของชุดข้อความเนทีฟอย่างถูกต้อง โปรแกรมแก้ไขข้อบกพร่องจะแก้ไขข้อบกพร่องของเทรดหลักได้ Abd เท่านั้น ไม่ประมวลผลเทรดอื่นๆ

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

    Program terminated with signal SIGTRAP, Trace/breakpoint trap.
          The program no longer exists.