Android Studio มีโปรแกรมแก้ไขข้อบกพร่องที่ช่วยให้คุณทำสิ่งต่อไปนี้และอื่นๆ ได้
- เลือกอุปกรณ์ที่จะแก้ไขข้อบกพร่องของแอป
- ตั้งค่าเบรกพอยต์ในโค้ด Java, Kotlin และ C/C++
- ตรวจสอบตัวแปรและประเมินนิพจน์ขณะรันไทม์
หน้านี้มีวิธีการสำหรับการดำเนินการพื้นฐานของโปรแกรมแก้ไขข้อบกพร่อง ดูเอกสารประกอบเพิ่มเติมได้ที่เอกสารประกอบการแก้ไขข้อบกพร่องของ IntelliJ IDEA
เปิดใช้การแก้ไขข้อบกพร่อง
ก่อนที่จะเริ่มแก้ไขข้อบกพร่อง ให้ทำดังนี้
- เปิดใช้การแก้ไขข้อบกพร่องในอุปกรณ์
- หากคุณใช้โปรแกรมจำลอง การแก้ไขข้อบกพร่องจะเปิดใช้อยู่โดยค่าเริ่มต้น แต่สำหรับอุปกรณ์ที่เชื่อมต่อ คุณต้องเปิดใช้การแก้ไขข้อบกพร่องในตัวเลือกสำหรับนักพัฒนาแอปของอุปกรณ์
- เรียกใช้ตัวแปรบิลด์ที่แก้ไขข้อบกพร่องได้
ใช้ตัวแปรบิลด์ที่มี
debuggable true(isDebuggable = trueในสคริปต์ Kotlin) ในการกำหนดค่าบิลด์โดยปกติแล้ว คุณสามารถเลือกตัวแปร "debug" เริ่มต้นที่รวมอยู่ในทุกโปรเจ็กต์ Android Studio แม้ว่าจะไม่ปรากฏในไฟล์
build.gradleก็ตาม อย่างไรก็ตาม หากคุณกำหนดประเภทบิลด์ใหม่ที่ควรแก้ไขข้อบกพร่องได้ คุณต้องเพิ่มdebuggable trueลงในประเภทบิลด์ ดังนี้- ตั้งค่าเบรกพอยต์ในโค้ดของแอป
- ในแถบเครื่องมือ ให้เลือกอุปกรณ์ที่จะแก้ไขข้อบกพร่องของแอปจากเมนูอุปกรณ์เป้าหมาย
รูปที่ 1 เมนูอุปกรณ์เป้าหมาย หากไม่ได้กำหนดค่าอุปกรณ์ไว้ คุณจะต้องเชื่อมต่ออุปกรณ์ผ่าน USB เชื่อมต่ออุปกรณ์ผ่าน Wi-Fi หรือสร้าง AVD เพื่อใช้โปรแกรมจำลองของ Android
- ในแถบเครื่องมือ ให้คลิกแก้ไขข้อบกพร่อง
หากแอปทำงานอยู่ในอุปกรณ์แล้ว กล่องโต้ตอบจะปรากฏขึ้นเพื่อถามว่าคุณต้องการเปลี่ยนจาก "เรียกใช้" เป็น "แก้ไขข้อบกพร่อง" หรือไม่ อุปกรณ์จะต้องรีสตาร์ทเพื่อเริ่มการแก้ไขข้อบกพร่อง หากต้องการให้อินสแตนซ์เดียวกันของแอปทำงานต่อไป ให้คลิกยกเลิกการแก้ไขข้อบกพร่อง แล้วแนบโปรแกรมแก้ไขข้อบกพร่องกับแอปที่ทำงานอยู่แทน ไม่เช่นนั้น Android Studio จะสร้าง APK, ลงชื่อด้วยคีย์การแก้ไขข้อบกพร่อง, ติดตั้งในอุปกรณ์ที่เลือก และเรียกใช้
หากคุณเพิ่มโค้ด C และ C++ ลงในโปรเจ็กต์ Android Studio จะเรียกใช้โปรแกรมแก้ไขข้อบกพร่อง LLDB ในหน้าต่างแก้ไขข้อบกพร่องเพื่อแก้ไขข้อบกพร่องของโค้ดแบบเนทีฟด้วย
- หากหน้าต่างแก้ไขข้อบกพร่องไม่ได้เปิดอยู่ ให้เลือกดู > หน้าต่างเครื่องมือ > แก้ไขข้อบกพร่อง หรือคลิกแก้ไขข้อบกพร่อง
ในแถบหน้าต่างเครื่องมือ - คลิกแนบโปรแกรมแก้ไขข้อบกพร่องกับกระบวนการ Android
- ในกล่องโต้ตอบเลือกกระบวนการ ให้เลือกกระบวนการที่ต้องการแนบโปรแกรมแก้ไขข้อบกพร่อง
- หากคุณใช้โปรแกรมจำลองหรืออุปกรณ์ที่รูท คุณสามารถเลือกแสดงกระบวนการทั้งหมดเพื่อดูกระบวนการทั้งหมดได้ ในอุปกรณ์ที่รูท ตัวเลือกนี้จะแสดงกระบวนการทั้งหมดที่ทำงานอยู่ในอุปกรณ์ อย่างไรก็ตาม ในอุปกรณ์ที่ไม่ได้รูท ระบบจะแสดงเฉพาะกระบวนการที่แก้ไขข้อบกพร่องได้เท่านั้น
- จากเมนูใช้การตั้งค่าโปรแกรมแก้ไขข้อบกพร่องของ Android จาก คุณสามารถเลือกการกำหนดค่าการแก้ไขข้อบกพร่อง/เรียกใช้ที่มีอยู่ได้ สำหรับโค้ด C และ C++ วิธีนี้จะช่วยให้คุณนำคำสั่งเริ่มต้น LLDB, คำสั่งหลังการแนบ LLDB และไดเรกทอรีสัญลักษณ์ในการกำหนดค่าที่มีอยู่มาใช้ซ้ำได้
- หากไม่มีการกำหนดค่าการแก้ไขข้อบกพร่อง/เรียกใช้ที่มีอยู่ ให้เลือกสร้างใหม่ การเลือกนี้จะเปิดใช้เมนูประเภทการแก้ไขข้อบกพร่อง ซึ่งคุณสามารถเลือกประเภทการแก้ไขข้อบกพร่องอื่นได้ โดยค่าเริ่มต้น Android Studio จะใช้ประเภทการแก้ไขข้อบกพร่องแบบตรวจหาอัตโนมัติเพื่อเลือกตัวเลือกโปรแกรมแก้ไขข้อบกพร่องที่ดีที่สุดให้คุณ โดยพิจารณาจากว่าโปรเจ็กต์มีโค้ด Java หรือ C/C++ หรือไม่
- คลิกตกลง
หน้าต่างการแก้ไขข้อบกพร่องจะปรากฏขึ้น
- แถบเครื่องมือการดำเนินการและการนำทาง ดูการทำงานกับเบรกพอยต์
- ตัวเลือกชุดข้อความ
- การประเมินและรายการนิพจน์ที่ตรวจสอบ ดูตรวจสอบตัวแปร
- จอแสดงผลแบบสแต็ก
- แผงตัวแปร ดูตรวจสอบตัวแปร
- ตรวจหาโดยอัตโนมัติ
- เลือกประเภทการแก้ไขข้อบกพร่องนี้หากต้องการให้ Android Studio เลือกตัวเลือกที่ดีที่สุดสำหรับโค้ดที่คุณกำลังแก้ไขข้อบกพร่องโดยอัตโนมัติ เช่น หากคุณมีโค้ด C หรือ C++ ในโปรเจ็กต์ Android Studio จะใช้ประเภทการแก้ไขข้อบกพร่องแบบคู่โดยอัตโนมัติ มิฉะนั้น Android Studio จะใช้ประเภทการแก้ไขข้อบกพร่อง Java-Only
- Java เท่านั้น
- เลือกประเภทการแก้ไขข้อบกพร่องนี้หากต้องการแก้ไขข้อบกพร่องเฉพาะโค้ดที่เขียนด้วย Java หรือ Kotlin โปรแกรมแก้ไขข้อบกพร่องเฉพาะ Java จะละเว้นเบรกพอยท์หรือการตรวจสอบที่คุณตั้งค่าไว้ในโค้ดแบบเนทีฟ
- เนทีฟเท่านั้น (ใช้ได้กับโค้ด C/C++ เท่านั้น)
-
เลือกประเภทการแก้ไขข้อบกพร่องนี้หากต้องการใช้ LLDB เท่านั้นเพื่อแก้ไขข้อบกพร่องของโค้ด เมื่อใช้การแก้ไขข้อบกพร่องประเภทนี้ มุมมองเซสชันโปรแกรมแก้ไขข้อบกพร่อง Java จะไม่พร้อมใช้งาน โดยค่าเริ่มต้น LLDB จะตรวจสอบเฉพาะโค้ดแบบเนทีฟและละเว้นเบรกพอยต์ในโค้ด Java หากต้องการแก้ไขข้อบกพร่องของโค้ด Java ด้วย ให้เปลี่ยนไปใช้ประเภทการแก้ไขข้อบกพร่องแบบตรวจหาอัตโนมัติหรือแบบคู่
การแก้ไขข้อบกพร่องแบบเนทีฟจะทำงานได้เฉพาะในอุปกรณ์ที่มีคุณสมบัติตรงตามข้อกำหนดต่อไปนี้
อุปกรณ์รองรับ
run-asหากต้องการตรวจสอบว่าอุปกรณ์รองรับ
run-asหรือไม่ ให้เรียกใช้คำสั่งต่อไปนี้ใน ADB Shell ที่เชื่อมต่อกับอุปกรณ์ของคุณrun-as your-package-name pwd
แทนที่
your-package-nameด้วยชื่อแพ็กเกจของแอป หากอุปกรณ์รองรับrun-asคำสั่งควรแสดงผลโดยไม่มีข้อผิดพลาดอุปกรณ์เปิดใช้
ptraceอยู่หากต้องการตรวจสอบว่า
ptraceเปิดใช้อยู่หรือไม่ ให้เรียกใช้คำสั่งต่อไปนี้ใน ADB Shell ที่เชื่อมต่อกับอุปกรณ์ของคุณsysctl kernel.yama.ptrace_scope
หากเปิดใช้
ptraceคำสั่งจะพิมพ์ค่า0หรือข้อผิดพลาดunknown keyหากไม่ได้เปิดใช้ptraceระบบจะพิมพ์ ค่าอื่นที่ไม่ใช่0
- แบบคู่ (Java + เนทีฟ) - ใช้ได้กับโค้ด C/C++ เท่านั้น
-
เลือกประเภทการแก้ไขข้อบกพร่องนี้หากต้องการสลับระหว่างการแก้ไขข้อบกพร่องทั้งโค้ด Java และโค้ดแบบเนทีฟ
Android Studio จะแนบทั้งโปรแกรมแก้ไขข้อบกพร่อง Java และ LLDB เข้ากับกระบวนการของแอปเพื่อให้คุณตรวจสอบเบรกพอยต์ได้ทั้งในโค้ด Java และโค้ดแบบเนทีฟโดยไม่ต้องรีสตาร์ทแอปหรือเปลี่ยนการกำหนดค่าการแก้ไขข้อบกพร่อง
ในรูปที่ 2 ให้สังเกตแท็บ 2 แท็บทางด้านขวาของชื่อหน้าต่างแก้ไขข้อบกพร่อง เนื่องจากแอปมีทั้งโค้ด Java และ C++ แท็บหนึ่งจึงใช้สำหรับการแก้ไขข้อบกพร่องของโค้ดแบบเนทีฟ และอีกแท็บหนึ่งใช้สำหรับการแก้ไขข้อบกพร่องของโค้ด Java ตามที่ระบุด้วย -java
รูปที่ 3 แท็บสำหรับการแก้ไขข้อบกพร่องของโค้ดแบบเนทีฟและแท็บสำหรับการแก้ไขข้อบกพร่องของโค้ด Java - เบรกพอยท์ของบรรทัด
- ประเภทที่พบบ่อยที่สุดคือเบรกพอยต์บรรทัด ซึ่งจะหยุดการทำงานของแอปชั่วคราวที่บรรทัดโค้ดที่ระบุ ขณะที่หยุดชั่วคราว คุณสามารถตรวจสอบตัวแปร ประเมินนิพจน์ แล้วเรียกใช้ต่อทีละบรรทัดเพื่อระบุสาเหตุของข้อผิดพลาดขณะรันไทม์
- เบรกพอยท์ของเมธอด
- เบรกพอยต์ของเมธอดจะหยุดการดำเนินการของแอปชั่วคราวเมื่อเข้าสู่หรือออกจากเมธอดที่เฉพาะเจาะจง ขณะที่หยุดชั่วคราว คุณสามารถตรวจสอบตัวแปร ประเมินนิพจน์ แล้วเรียกใช้ต่อทีละบรรทัดเพื่อระบุสาเหตุของข้อผิดพลาดขณะรันไทม์ เมื่อคุณตั้งค่าเบรกพอยต์ในฟังก์ชันที่ประกอบกันได้ โปรแกรมแก้ไขข้อบกพร่องจะแสดงพารามิเตอร์ของฟังก์ชันที่ประกอบกันได้และสถานะของพารามิเตอร์เพื่อช่วยระบุการเปลี่ยนแปลงที่อาจทำให้เกิดการจัดองค์ประกอบใหม่
- เบรกพอยท์ของฟิลด์
- เบรกพอยต์ของช่องจะหยุดการดำเนินการของแอปชั่วคราวเมื่ออ่านจากหรือเขียนไปยังช่องที่เฉพาะเจาะจง
- เบรกพอยท์ข้อยกเว้น
- เบรกพอยต์ข้อยกเว้นจะหยุดการทำงานของแอปชั่วคราวเมื่อมีการส่งข้อยกเว้น
- ค้นหาบรรทัดโค้ดที่ต้องการหยุดการดำเนินการชั่วคราว
- คลิกแถบด้านซ้ายตามบรรทัดโค้ดนั้น หรือวางเคอร์เซอร์ข้อความบนบรรทัด แล้วกด Control+F8 (ใน macOS ให้กด Command+F8)
- หากแอปทำงานอยู่แล้ว ให้คลิกแนบโปรแกรมแก้ไขข้อบกพร่องกับกระบวนการ Android
หรือหากต้องการเริ่มแก้ไขข้อบกพร่อง ให้คลิกแก้ไขข้อบกพร่อง
-
หากต้องการตรวจสอบแผนผังออบเจ็กต์ของตัวแปร ให้ขยายตัวแปรในมุมมองตัวแปร หากไม่เห็นมุมมองตัวแปร ให้คลิกการตั้งค่าเลย์เอาต์
และตรวจสอบว่าได้เลือกตัวแปรแล้ว
-
หากต้องการไปยังบรรทัดถัดไปในโค้ดโดยไม่ต้องป้อนเมธอด ให้คลิกข้าม

-
หากต้องการไปยังบรรทัดแรกภายในการเรียกใช้เมธอด ให้คลิกเข้าสู่

-
หากต้องการไปยังบรรทัดถัดไปนอกเมธอดปัจจุบัน ให้คลิกออกจากขั้นตอน

-
หากต้องการเรียกใช้แอปตามปกติ ให้คลิกกลับมาทำงานอีกครั้ง

- Android Studio จะเปลี่ยนไปใช้แท็บ <your-module> เมื่อโปรแกรมแก้ไขข้อบกพร่อง LLDB พบเบรกพอยต์ในโค้ด C/C++ นอกจากนี้ยังมีแผงเฟรม ตัวแปร และการตรวจสอบที่ทำงานเหมือนกับตอนที่คุณแก้ไขข้อบกพร่องของโค้ด Java ทุกประการ
แม้ว่าแผงชุดข้อความจะไม่พร้อมใช้งานในมุมมองเซสชัน LLDB แต่คุณสามารถเข้าถึงกระบวนการของแอปได้โดยใช้รายการในแผงเฟรม ดูข้อมูลเพิ่มเติมเกี่ยวกับแผงเหล่านี้ในส่วนเกี่ยวกับวิธีแก้ไขข้อบกพร่องของเฟรมหน้าต่างและตรวจสอบตัวแปร
หมายเหตุ: ขณะตรวจสอบเบรกพอยต์ในโค้ดแบบเนทีฟ ระบบ Android จะระงับเครื่องเสมือนที่เรียกใช้ไบต์โค้ด Java ของแอป ซึ่งหมายความว่าคุณจะไม่สามารถโต้ตอบกับโปรแกรมแก้ไขข้อบกพร่อง Java หรือดึงข้อมูลสถานะใดๆ จากเซสชันโปรแกรมแก้ไขข้อบกพร่อง Java ขณะตรวจสอบเบรกพอยต์ในโค้ดแบบเนทีฟ
- Android Studio จะเปลี่ยนไปที่แท็บ <your-module>-java เมื่อโปรแกรมแก้ไขข้อบกพร่อง Java พบเบรกพอยต์ในโค้ด Java หรือ Kotlin
- ขณะแก้ไขข้อบกพร่องด้วย LLDB คุณสามารถใช้เทอร์มินัล LLDB ในมุมมองเซสชัน LLDB เพื่อส่งตัวเลือกบรรทัดคำสั่งไปยัง LLDB ได้ หากคุณมีคำสั่งบางอย่างที่ต้องการให้ LLDB ดำเนินการทุกครั้งที่เริ่มแก้ไขข้อบกพร่องของแอป ไม่ว่าจะก่อนหรือหลังที่โปรแกรมแก้ไขข้อบกพร่องเชื่อมต่อกับกระบวนการของแอป คุณสามารถ เพิ่มคำสั่งเหล่านั้นลงในการกำหนดค่าการแก้ไขข้อบกพร่องได้
- ป้อนนิพจน์ที่จะดูหรือแสดง
- คลิกเพิ่มลงใน Watch หรือกด Enter เพื่อประเมินนิพจน์ 1 ครั้ง
- อุปกรณ์จริงหรือโปรแกรมจำลองเป้าหมายใช้ CPU x86 หรือ x86_64 หากอุปกรณ์ใช้ ARM CPU คุณต้องจัดแนวขอบเขตของที่อยู่ตัวแปรในหน่วยความจำเป็น 4 ไบต์สำหรับโปรเซสเซอร์ 32 บิต หรือ 8 ไบต์สำหรับโปรเซสเซอร์ 64 บิต หากต้องการจัดแนวตัวแปรในโค้ดแบบเนทีฟ ให้ระบุ
__attribute__((aligned(num_bytes)))ในการประกาศตัวแปร ดังที่แสดงด้านล่าง// For a 64-bit ARM processor int my_counter __attribute__((aligned(8)));
- คุณได้กำหนดจุดเฝ้าระวังไว้ไม่เกิน 3 จุดแล้ว Android Studio รองรับ Watchpoint สูงสุด 4 จุดในอุปกรณ์เป้าหมาย x86 หรือ x86_64 เท่านั้น อุปกรณ์อื่นๆ อาจรองรับจุดเฝ้าดูน้อยกว่า
- ขณะที่แอปถูกระงับที่เบรกพอยต์ ให้ไปที่แผงตัวแปรในมุมมองเซสชัน LLDB
-
คลิกขวาที่ตัวแปรซึ่งใช้บล็อกหน่วยความจำที่ต้องการติดตาม แล้วเลือกเพิ่ม Watchpoint
รูปที่ 9 เพิ่ม Watchpoint ให้กับตัวแปรในหน่วยความจำ กล่องโต้ตอบสำหรับกำหนดค่า Watchpoint จะปรากฏขึ้นดังที่แสดงในรูปที่ 9
กำหนดค่า Watchpoint ด้วยตัวเลือกต่อไปนี้
- เปิดใช้: ยกเลิกการเลือกตัวเลือกนี้หากต้องการบอกให้ Android Studio ละเว้น Watchpoint จนกว่าคุณจะเปลี่ยนการตั้งค่า Android Studio จะบันทึก Watchpoint เพื่อให้คุณเข้าถึงได้ในภายหลัง
- ระงับ: โดยค่าเริ่มต้น ระบบ Android จะระงับกระบวนการของแอปเมื่อเข้าถึงบล็อกหน่วยความจำที่คุณกำหนดให้กับ Watchpoint ยกเลิกการเลือกตัวเลือกนี้หากไม่ต้องการให้เกิดลักษณะการทำงานนี้ ซึ่งจะแสดงตัวเลือกเพิ่มเติมที่คุณใช้เพื่อปรับแต่งลักษณะการทำงานเมื่อระบบโต้ตอบกับ Watchpoint ได้ ได้แก่ บันทึกข้อความลงในคอนโซลและนำออกเมื่อพบ
- ประเภทการเข้าถึง: เลือกว่าแอปควรทริกเกอร์ Watchpoint เมื่อพยายามอ่านหรือเขียนลงในบล็อกหน่วยความจำที่ระบบจัดสรรให้กับตัวแปรหรือไม่ หากต้องการเรียกให้ Watchpoint ทำงานทั้งในการอ่านหรือการเขียน ให้เลือกใดก็ได้
- คลิกเสร็จสิ้น
- ในรายการตัวแปร ให้คลิกขวาที่ใดก็ได้ในบรรทัดทรัพยากรเพื่อแสดงรายการ
- ในรายการ ให้เลือกดูเป็น แล้วเลือกรูปแบบที่ต้องการใช้
รูปแบบที่ใช้ได้จะขึ้นอยู่กับประเภทข้อมูลของทรัพยากรที่คุณเลือก คุณอาจเห็นตัวเลือกต่อไปนี้อย่างน้อย 1 รายการ
- Class: แสดงคำจำกัดความของคลาส
- toString: รูปแบบสตริงที่แสดง
- ออบเจ็กต์: แสดงคำจำกัดความของออบเจ็กต์ (อินสแตนซ์ของคลาส)
- อาร์เรย์: แสดงในรูปแบบอาร์เรย์
- การประทับเวลา: แสดงวันที่และเวลาดังนี้ yyyy-mm-dd hh:mm:ss
- อัตโนมัติ: Android Studio จะเลือกรูปแบบที่ดีที่สุดตามประเภทข้อมูล
- เลขฐานสอง: แสดงค่าเลขฐานสองโดยใช้เลขศูนย์และเลขหนึ่ง
- MeasureSpec: ค่าที่ส่งจากระดับบนไปยังระดับย่อยที่เลือก
ดู
MeasureSpec - เลขฐาน 16: แสดงเป็นค่าเลขฐาน 16
- Primitive: แสดงเป็นค่าตัวเลขโดยใช้ประเภทข้อมูลพื้นฐาน
- จำนวนเต็ม: แสดงเป็นค่าตัวเลขประเภท
Integer
- คลิกขวาที่ค่าทรัพยากร
- เลือกดูในฐานะ
- เลือกสร้าง
- กล่องโต้ตอบ Java Data Type Renderers จะปรากฏขึ้น ทำตามวิธีการที่หัวข้อโปรแกรมแสดงผลประเภทข้อมูล Java
ดึงดูด
android { buildTypes { customDebugType { debuggable true ... } } }
Kotlin
android { buildTypes { create("customDebugType") { isDebuggable = true ... } } }
พร็อพเพอร์ตี้นี้ยังใช้กับโมดูลที่มีโค้ด C/C++ ด้วย
หมายเหตุ: ไม่มีการใช้พร็อพเพอร์ตี้ jniDebuggable อีกต่อไป
หากแอปของคุณขึ้นอยู่กับโมดูลไลบรารีที่คุณต้องการแก้ไขข้อบกพร่องด้วย ไลบรารีนั้นต้องรวมอยู่ในแพ็กเกจ debuggable true เพื่อให้ยังคงมีสัญลักษณ์การแก้ไขข้อบกพร่องอยู่
หากต้องการตรวจสอบว่าตัวแปรที่แก้ไขข้อบกพร่องได้ของโปรเจ็กต์แอปได้รับตัวแปรที่แก้ไขข้อบกพร่องได้ของโมดูลไลบรารี ให้เผยแพร่ไลบรารีเวอร์ชันที่ไม่ใช่ค่าเริ่มต้น
เริ่มแก้ไขข้อบกพร่อง
คุณเริ่มเซสชันการแก้ไขข้อบกพร่องได้ดังนี้
แนบโปรแกรมแก้ไขข้อบกพร่องกับแอปที่ทำงานอยู่
หากแอปทำงานในอุปกรณ์อยู่แล้ว คุณจะเริ่มแก้ไขข้อบกพร่องได้โดยไม่ต้องรีสตาร์ทแอป โดยทำดังนี้
แท็บกระบวนการใน Device Explorer (มุมมอง > หน้าต่างเครื่องมือ > Device Explorer) ยังมีรายการกระบวนการที่แก้ไขข้อบกพร่องได้ด้วย จากนั้นคุณสามารถเลือกกระบวนการและทำการหยุด
บังคับหยุด
หรือแนบโปรแกรมแก้ไขข้อบกพร่องกับกระบวนการที่ระบุ
หน้าต่างการแก้ไขข้อบกพร่อง
หน้าต่างการแก้ไขข้อบกพร่องแบ่งออกเป็น
หมายเหตุ: โปรแกรมแก้ไขข้อบกพร่องและ Garbage Collector ของ Android Studio ไม่ได้ผสานรวมกันอย่างสมบูรณ์ เครื่องเสมือน Android รับประกันว่าออบเจ็กต์ที่โปรแกรมแก้ไขข้อบกพร่องรับรู้จะไม่ถูกรวบรวมขยะจนกว่าโปรแกรมแก้ไขข้อบกพร่องจะยกเลิกการเชื่อมต่อ ซึ่งอาจส่งผลให้มีการสะสมออบเจ็กต์ขณะที่โปรแกรมแก้ไขข้อบกพร่องเชื่อมต่ออยู่ ตัวอย่างเช่น หากโปรแกรมแก้ไขข้อบกพร่องเห็นเทรดที่ทำงานอยู่ ระบบจะไม่เก็บขยะออบเจ็กต์ Thread ที่เชื่อมโยงจนกว่าโปรแกรมแก้ไขข้อบกพร่องจะยกเลิกการเชื่อมต่อ แม้ว่าเทรดจะสิ้นสุดลงแล้วก็ตาม
เปลี่ยนประเภทโปรแกรมแก้ไขข้อบกพร่อง
เนื่องจากต้องใช้เครื่องมือแก้ไขข้อบกพร่องที่แตกต่างกันในการแก้ไขข้อบกพร่องของโค้ด Java/Kotlin และโค้ด C/C++ โปรแกรมแก้ไขข้อบกพร่องของ Android Studio จึงให้คุณเลือกประเภทโปรแกรมแก้ไขข้อบกพร่องที่จะใช้ได้ โดยค่าเริ่มต้น Android Studio จะตัดสินใจว่าจะใช้โปรแกรมแก้ไขข้อบกพร่องใดโดยอิงตามภาษาที่ตรวจพบในโปรเจ็กต์โดยใช้ประเภทโปรแกรมแก้ไขข้อบกพร่องตรวจหาอัตโนมัติ
หากต้องการเลือกโปรแกรมแก้ไขข้อบกพร่องในการกำหนดค่าการแก้ไขข้อบกพร่องด้วยตนเอง ให้คลิกเรียกใช้ > แก้ไขการกำหนดค่า นอกจากนี้ คุณยังเลือกโปรแกรมแก้ไขข้อบกพร่องในกล่องโต้ตอบที่ปรากฏขึ้นเมื่อคลิกเรียกใช้ > แนบโปรแกรมแก้ไขข้อบกพร่องกับกระบวนการ Android ได้ด้วย
ประเภทการแก้ไขข้อบกพร่องที่ใช้ได้มีดังนี้
หมายเหตุ: ขณะแก้ไขข้อบกพร่องของโค้ดแบบเนทีฟที่คอมไพเลอร์เพิ่มประสิทธิภาพ คุณอาจได้รับข้อความเตือนต่อไปนี้This function was
compiled with optimizations enabled. Some debugger features may not be
available เมื่อใช้แฟล็กการเพิ่มประสิทธิภาพ คอมไพเลอร์จะทำการเปลี่ยนแปลงโค้ดที่คอมไพล์แล้วเพื่อให้ทำงานได้อย่างมีประสิทธิภาพมากขึ้น ซึ่งอาจทำให้โปรแกรมแก้ไขข้อบกพร่องรายงานข้อมูลที่ไม่คาดคิดหรือไม่ถูกต้อง เนื่องจากโปรแกรมแก้ไขข้อบกพร่องแมปโค้ดที่คอมไพล์แล้วซึ่งเพิ่มประสิทธิภาพกลับไปยังซอร์สโค้ดต้นฉบับได้ยาก
ด้วยเหตุนี้ คุณจึงควรปิดใช้การเพิ่มประสิทธิภาพคอมไพเลอร์ขณะแก้ไขข้อบกพร่องของโค้ดแบบเนทีฟ
ใช้บันทึกของระบบ
บันทึกของระบบจะแสดงข้อความของระบบขณะที่คุณแก้ไขข้อบกพร่องของแอป ข้อความเหล่านี้รวมถึงข้อมูลจากแอปที่ทำงานบนอุปกรณ์ หากต้องการใช้บันทึกของระบบเพื่อแก้ไขข้อบกพร่องของแอป ให้ตรวจสอบว่าโค้ดเขียนข้อความในบันทึกและพิมพ์สแต็กเทรซสำหรับข้อยกเว้นขณะที่แอปอยู่ในระยะการพัฒนา
เขียนข้อความในบันทึกในโค้ด
หากต้องการเขียนข้อความในบันทึกในโค้ด ให้ใช้คลาส
Log ข้อความในบันทึกช่วยให้คุณเข้าใจขั้นตอนการดำเนินการโดยการรวบรวมเอาต์พุตการแก้ไขข้อบกพร่องของระบบขณะที่คุณโต้ตอบกับแอป นอกจากนี้ ข้อความในบันทึกยังบอกได้ด้วยว่าส่วนใดของแอปที่ทำงานไม่สำเร็จ ดูข้อมูลเพิ่มเติมเกี่ยวกับการบันทึกได้ที่เขียนและดูบันทึกด้วย Logcat
ตัวอย่างต่อไปนี้แสดงวิธีเพิ่มข้อความในบันทึกเพื่อระบุว่าข้อมูลสถานะก่อนหน้าพร้อมใช้งานเมื่อกิจกรรมเริ่มต้นหรือไม่
Kotlin
import android.util.Log ... class MyActivity : Activity() { ... override fun onCreate(savedInstanceState: Bundle?) { ... if (savedInstanceState != null) { Log.d(TAG, "onCreate() Restoring previous state") /* restore state */ } else { Log.d(TAG, "onCreate() No saved state available") /* initialize app */ } ... } ... companion object { private val TAG: String = MyActivity::class.java.simpleName ... } }
Java
import android.util.Log; ... public class MyActivity extends Activity { private static final String TAG = MyActivity.class.getSimpleName(); ... @Override public void onCreate(Bundle savedInstanceState) { ... if (savedInstanceState != null) { Log.d(TAG, "onCreate() Restoring previous state"); /* restore state */ } else { Log.d(TAG, "onCreate() No saved state available"); /* initialize app */ } ... } }
ในระหว่างการพัฒนา โค้ดยังสามารถตรวจจับข้อยกเว้นและเขียนสแต็กเทรซลงในบันทึกของระบบได้ด้วย
Kotlin
fun someOtherMethod() { try { ... } catch (e : SomeException) { Log.d(TAG, "someOtherMethod()", e) } }
Java
void someOtherMethod() { try { ... } catch (SomeException e) { Log.d(TAG, "someOtherMethod()", e); } }
หมายเหตุ: นำข้อความในบันทึกแก้ไขข้อบกพร่องและการเรียกพิมพ์สแต็กเทรซออกจากโค้ดเมื่อคุณพร้อมที่จะเผยแพร่แอป โดยตั้งค่าแฟล็ก DEBUG และวางข้อความในบันทึกแก้ไขข้อบกพร่องไว้ในคำสั่งแบบมีเงื่อนไข
ดูบันทึกของระบบ
คุณสามารถดูและกรองข้อความแก้ไขข้อบกพร่องและข้อความอื่นๆ ของระบบได้ในหน้าต่าง Logcat ดังที่แสดงในรูปที่ 4 เช่น คุณจะเห็นข้อความเมื่อมีการเก็บขยะหรือข้อความที่คุณเพิ่มลงในแอปด้วยคลาส Log
หากต้องการใช้ Logcat ให้เริ่มแก้ไขข้อบกพร่อง แล้วเลือกแท็บ Logcat
ดูคำอธิบายของ Logcat และตัวเลือกการกรองได้ที่เขียนและดูบันทึกด้วย Logcat
ทำงานกับเบรกพอยท์
Android Studio รองรับเบรกพอยต์ที่ทริกเกอร์การดำเนินการแก้ไขข้อบกพร่องที่แตกต่างกัน เบรกพอยท์มีหลายประเภท ดังนี้
คุณสามารถตั้งค่าเบรกพอยต์แบบมีเงื่อนไขซึ่งจะระงับการดำเนินการก็ต่อเมื่อเป็นไปตามเงื่อนไขที่เฉพาะเจาะจงเท่านั้น นอกจากนี้ คุณยังตั้งค่าเบรกพอยต์การบันทึกที่เขียนลงใน Logcat โดยไม่ระงับการดำเนินการได้ด้วย ซึ่งจะช่วยหลีกเลี่ยงไม่ให้โค้ดของคุณเต็มไปด้วยคำสั่งบันทึก
หากต้องการเพิ่มเบรกพอยต์บรรทัด ให้ทำดังนี้
จุดสีแดงจะปรากฏข้างบรรทัดเมื่อคุณตั้งค่าเบรกพอยต์ ดังที่แสดงในรูปที่ 5
เมื่อการเรียกใช้โค้ดถึงเบรกพอยต์ Android Studio จะหยุดการเรียกใช้แอปชั่วคราว
หากต้องการระบุสถานะของแอป ให้ใช้เครื่องมือในแท็บโปรแกรมแก้ไขข้อบกพร่อง ดังนี้
หากโปรเจ็กต์ใช้โค้ดแบบเนทีฟ โดยค่าเริ่มต้น ประเภทการแก้ไขข้อบกพร่อง "ตรวจหาอัตโนมัติ" จะแนบทั้งโปรแกรมแก้ไขข้อบกพร่อง Java และ LLDB กับแอปเป็น 2 กระบวนการแยกกัน คุณสามารถสลับระหว่างการตรวจสอบเบรกพอยต์ Java และ C/C++ ได้โดยไม่ต้องรีสตาร์ทแอปหรือเปลี่ยนการตั้งค่า
หมายเหตุ: หากต้องการให้ Android Studio ตรวจหาเบรกพอยต์ในโค้ด C หรือ C++ คุณต้องใช้ประเภทการแก้ไขข้อบกพร่องที่รองรับ LLDB เช่น ตรวจหาอัตโนมัติ, แบบเนทีฟ หรือแบบคู่ คุณเปลี่ยนประเภทการแก้ไขข้อบกพร่องที่ Android Studio ใช้ได้โดยแก้ไขการกำหนดค่าการแก้ไขข้อบกพร่อง หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับประเภทการแก้ไขข้อบกพร่องต่างๆ โปรดอ่านส่วนเกี่ยวกับการใช้ประเภทการแก้ไขข้อบกพร่องอื่นๆ
เมื่อ Android Studio ติดตั้งใช้งานแอปในอุปกรณ์เป้าหมาย หน้าต่างแก้ไขข้อบกพร่องจะเปิดขึ้นพร้อมแท็บหรือมุมมองเซสชันการแก้ไขข้อบกพร่องสำหรับกระบวนการแก้ไขข้อบกพร่องแต่ละกระบวนการ ดังที่แสดงในรูปที่ 6
ขณะแก้ไขข้อบกพร่องของโค้ด C/C++ คุณยังตั้งค่าเบรกพอยต์ประเภทพิเศษที่เรียกว่า Watchpoint ได้ด้วย ซึ่งจะระงับกระบวนการของแอปเมื่อแอปโต้ตอบกับบล็อกหน่วยความจำหนึ่งๆ ดูข้อมูลเพิ่มเติมได้ที่ส่วนเกี่ยวกับวิธีเพิ่ม Watchpoint
ดูและกำหนดค่าเบรกพอยท์
หากต้องการดูเบรกพอยต์ทั้งหมดและกำหนดการตั้งค่าเบรกพอยต์ ให้คลิกดูเบรกพอยต์
ในหน้าต่างแก้ไขข้อบกพร่อง หน้าต่างเบรกพอยต์จะปรากฏขึ้นดังที่แสดงในรูปที่ 7
หน้าต่างเบรกพอยท์ช่วยให้คุณเปิดหรือปิดใช้เบรกพอยท์แต่ละรายการจากรายการในแผงได้ หากเบรกพอยต์ถูกปิดใช้ Android Studio จะไม่หยุดแอปชั่วคราวเมื่อถึงเบรกพอยต์นั้น
เลือกเบรกพอยต์จากรายการเพื่อกำหนดการตั้งค่า คุณสามารถกำหนดค่าเบรกพอยต์ให้ปิดใช้ในตอนแรก และให้ระบบเปิดใช้หลังจากที่เบรกพอยต์อื่นถูกเรียกใช้ นอกจากนี้ คุณยังกำหนดค่าได้ว่าจะปิดใช้เบรกพอยต์หลังจากที่เรียกใช้หรือไม่ หากต้องการตั้งค่าเบรกพอยต์สำหรับข้อยกเว้นใดๆ ให้เลือกเบรกพอยต์ข้อยกเว้นในรายการเบรกพอยต์
หากต้องการปิดใช้เบรกพอยท์ทั้งหมดชั่วคราว ให้คลิกปิดเสียงเบรกพอยท์
ในหน้าต่างแก้ไขข้อบกพร่อง คลิกอีกครั้งเพื่อเปิดใช้อีกครั้ง
เฟรมหน้าต่างแก้ไขข้อบกพร่อง
ในหน้าต่างโปรแกรมแก้ไขข้อบกพร่อง แผงเฟรมช่วยให้คุณตรวจสอบสแตกเฟรมที่ทำให้เกิดเบรกพอยต์ปัจจุบันได้ ซึ่งจะช่วยให้คุณไปยังส่วนต่างๆ และตรวจสอบสแตกเฟรม รวมถึงตรวจสอบรายการชุดข้อความในแอป Android ได้
หากต้องการเลือกชุดข้อความ ให้ใช้เมนูตัวเลือกชุดข้อความและดูสแตกเฟรมของชุดข้อความนั้น คลิกองค์ประกอบในเฟรมเพื่อเปิดแหล่งที่มาในเครื่องมือแก้ไข นอกจากนี้ คุณยังปรับแต่งการนำเสนอเธรดและส่งออกสแตกเฟรมได้ตามที่อธิบายไว้ใน คู่มือตรวจสอบเฟรม
ตรวจสอบตัวแปร
ในหน้าต่างโปรแกรมแก้ไขข้อบกพร่อง แผงตัวแปรจะช่วยให้คุณตรวจสอบตัวแปรได้เมื่อระบบหยุดแอปที่เบรกพอยต์และคุณเลือกเฟรมจากแผงเฟรม แผงตัวแปรยังช่วยให้คุณประเมินนิพจน์เฉพาะกิจโดยใช้เมธอดแบบคงที่และ/หรือตัวแปรที่ใช้ได้ภายในเฟรมที่เลือก
วิธีเพิ่มนิพจน์ลงในแผนผังออบเจ็กต์ (ขณะที่กำลังแก้ไขข้อบกพร่องของแอปพลิเคชัน)
หรือหากแผนผังออบเจ็กต์มีนิพจน์ที่ต้องการดู คุณสามารถลากนิพจน์นั้นไปไว้ที่ด้านบนของแผนผังเพื่อเพิ่มเป็นนิพจน์ที่ดูได้
นิพจน์ที่เฝ้าดูจะอัปเดตเมื่อถึงเบรกพอยต์หรือคุณดำเนินการผ่านโค้ดทีละขั้นตอน
นิพจน์ที่ประเมินแล้วจะยังคงแสดงที่ด้านบนของโครงสร้างออบเจ็กต์จนกว่าคุณจะประเมินนิพจน์อื่นหรือดำเนินการผ่านโค้ดด้วยตนเอง
หากต้องการนำนิพจน์ที่เฝ้าติดตามออกจากโครงสร้างออบเจ็กต์ ให้คลิกขวาที่นิพจน์ แล้วคลิกนำการเฝ้าติดตามออก
เพิ่มจุดเฝ้าระวัง
ขณะแก้ไขข้อบกพร่องของโค้ด C/C++ คุณสามารถตั้งค่าเบรกพอยต์ประเภทพิเศษที่เรียกว่า Watchpoint ซึ่งจะระงับกระบวนการของแอปเมื่อแอปโต้ตอบกับบล็อกหน่วยความจำหนึ่งๆ ได้ เช่น หากคุณตั้งค่าตัวชี้ 2 ตัวไปยังบล็อกหน่วยความจำและกำหนด Watchpoint ให้กับบล็อกนั้น การใช้ตัวชี้ใดตัวชี้หนึ่งเพื่อเข้าถึงบล็อกหน่วยความจำนั้นจะทริกเกอร์ Watchpoint
ใน Android Studio คุณสามารถสร้าง Watchpoint ระหว่างรันไทม์ได้โดยเลือกตัวแปรที่เฉพาะเจาะจง แต่ LLDB จะกำหนด Watchpoint ให้กับบล็อกหน่วยความจำที่ระบบจัดสรรให้กับตัวแปรนั้นเท่านั้น ไม่ใช่ตัวแปรเอง ซึ่งแตกต่างจากการเพิ่มตัวแปรลงในแผงการตรวจสอบ ซึ่งช่วยให้คุณสังเกตค่าของตัวแปรได้ แต่ไม่อนุญาตให้ระงับกระบวนการของแอปเมื่อระบบอ่านหรือเปลี่ยนแปลงค่าในหน่วยความจำ
หมายเหตุ: เมื่อกระบวนการของแอปออกจากฟังก์ชันและระบบจัดสรรตัวแปรในเครื่องออกจากหน่วยความจำ คุณต้องกำหนด Watchpoint ที่สร้างขึ้นสำหรับตัวแปรเหล่านั้นอีกครั้ง
หากต้องการตั้งค่า Watchpoint คุณต้องมีคุณสมบัติตรงตามข้อกำหนดต่อไปนี้
หมายเหตุ: เมื่อแก้ไขข้อบกพร่องของแอปด้วย ABI ของ ARM แบบ 32 บิต การเพิ่ม Watchpoint หรือวางเมาส์เหนือตัวแปรภายในโค้ดเพื่อตรวจสอบค่าอาจทำให้แอปขัดข้อง วิธีแก้ปัญหาเบื้องต้นคือแก้ไขข้อบกพร่องโดยใช้ไบนารี ARM, x86 หรือ x86_64 แบบ 64 บิต ปัญหานี้จะได้รับการแก้ไขใน Android Studio รุ่นถัดไป
หากมีคุณสมบัติตรงตามข้อกำหนด คุณจะเพิ่ม Watchpoint ได้โดยทำดังนี้
หากต้องการดู Watchpoint ทั้งหมดและกำหนดการตั้งค่า Watchpoint ให้คลิกดูเบรกพอยต์
ในหน้าต่างแก้ไขข้อบกพร่อง กล่องโต้ตอบเบรกพอยต์จะปรากฏขึ้นดังที่แสดงในรูปที่ 10
หลังจากเพิ่ม Watchpoint แล้ว ให้คลิกกลับมาทำงานต่อ
ในหน้าต่างแก้ไขข้อบกพร่องเพื่อกลับมาทำงานต่อในกระบวนการของแอป โดยค่าเริ่มต้น หากแอปพยายามเข้าถึงบล็อกหน่วยความจำที่คุณตั้งค่า Watchpoint ไว้ ระบบ Android จะระงับกระบวนการของแอปและไอคอน Watchpoint
จะปรากฏข้างบรรทัดโค้ดที่แอปดำเนินการล่าสุด ดังที่แสดงในรูปที่ 11
ดูและเปลี่ยนรูปแบบการแสดงค่าทรัพยากร
ในโหมดแก้ไขข้อบกพร่อง คุณสามารถดูค่าทรัพยากรและเลือกรูปแบบการแสดงผลอื่นสำหรับตัวแปรในโค้ด Java หรือ Kotlin ได้ เมื่อแท็บตัวแปรแสดงขึ้นและเลือกเฟรมแล้ว ให้ทำดังนี้
วิธีสร้างรูปแบบที่กำหนดเองมีดังนี้