- (void)viewDidLoad
{
NSLog(@"%s", __func__);
// ...
}
ในviewDidLoad
ของ iOS 8 ส่วนขยาย NSLog
อะไรเอาท์พุทใน Xcode NSLog
ทำงานได้ตามปกติในแอปคอนเทนเนอร์
ฉันจะรับผลลัพธ์จากข้อความดีบักจากส่วนขยายได้อย่างไร
- (void)viewDidLoad
{
NSLog(@"%s", __func__);
// ...
}
ในviewDidLoad
ของ iOS 8 ส่วนขยาย NSLog
อะไรเอาท์พุทใน Xcode NSLog
ทำงานได้ตามปกติในแอปคอนเทนเนอร์
ฉันจะรับผลลัพธ์จากข้อความดีบักจากส่วนขยายได้อย่างไร
คำตอบ:
ขั้นตอนในการแก้ไขข้อบกพร่องส่วนขยายแอป:
เรียกใช้แอปคอนเทนเนอร์ ในขั้นตอนนี้ Xcode จะอัปโหลดแอปคอนเทนเนอร์และส่วนขยายแอปไปยังอุปกรณ์หรือโปรแกรมจำลอง
หยุดแอปคอนเทนเนอร์ ขั้นตอนนี้มีความสำคัญเมื่อคุณแก้ไขข้อบกพร่องในโปรแกรมจำลอง หากคุณไม่ทำ Xcode จะแจ้งให้คุณทราบว่ามีการใช้งานโปรแกรมจำลองอยู่
ใน Xcode ให้กดเมนู Debug -> Attach to Process -> By Process Identifer (PID) หรือ Name ... ป้อนตัวระบุของแอพ ext เช่น com.abc.ContainerApp.MyExtension เพื่อเริ่มการดีบัก อย่าลืมกำหนดจุดพัก (อัปเดตเมื่อ 25 ส.ค. 2557: คุณสามารถป้อน MyExtension (ชื่อนามสกุลของคุณ) ได้โดยตรง)
ในอุปกรณ์หรือโปรแกรมจำลองให้เปิดส่วนขยายแอปของคุณ
ฉันพบว่าขั้นตอนการดีบักด้านบนทำงานได้ไม่ดีใน Xcode 6 beta 6 กับ iOS 8 SDK beta 5 บนเครื่องจำลอง
วิธีการแก้:
เบรกพอยต์ทำงาน แต่ฉันไม่รู้ว่าทำไมบันทึกไม่แสดงในหน้าต่างเอาต์พุต
ฉันมีปัญหานี้เหมือนกัน มันใช้ได้กับฉันถ้าคุณเข้าไปใน Simulator ของคุณภายใต้เมนู Debug -> Open System Log ...
จากที่นี่คุณจะเห็นบันทึกทั้งหมดของ iPhone Simulator (รวมถึงบันทึกส่วนขยายของคุณ)
NSLog
คือการทำงานอย่างสมบูรณ์แบบ
คุณไม่เห็นสิ่งที่กำลังบันทึกอยู่ในพื้นที่ดีบักของ Xcode เนื่องจากตัวดีบัก Xcode ไม่ได้แนบกับส่วนขยายของคุณ ส่วนขยายเกือบทั้งหมดเป็นอิสระจากแอปที่มีอยู่ ตัวอย่างเช่นมีตัวระบุบันเดิลแยกต่างหากและยังเป็นกระบวนการแยกต่างหากบนระบบปฏิบัติการ
ฉันประสบความสำเร็จหลายประการในการรับ Xcode เพื่อแนบกับส่วนขยาย ดูเหมือนว่ามันจะแนบโดยอัตโนมัติและปรากฏในเนวิเกเตอร์การดีบักว่า "กำลังรอการแนบ" แต่จะไม่ติด
บางครั้งฉันสามารถเรียกใช้เป้าหมายส่วนขยายของฉันใน Xcode:
จากนั้นมีตัวเลือกให้เลือกแอปพลิเคชันที่จะเรียกใช้ส่วนขยายของฉันในกรณีนี้ฉันจะเลือกคำแนะนำ "วันนี้" ซึ่งเป็นศูนย์การแจ้งเตือน
จากนั้นบางครั้งก็จะแนบดีบักเกอร์กับส่วนขยายของฉัน โปรดทราบว่าวิธีนี้ใช้ได้กับอุปกรณ์ทางกายภาพเท่านั้นดูเหมือนว่า
หากไม่แนบคุณสามารถใช้วิธีการแนบด้วยตนเองในคำตอบของ @ VinceYaun
ฉันยังประสบความสำเร็จหลายประการโดยใช้วิธีการแนบอื่น ๆ ส่วนใหญ่ไม่ประสบความสำเร็จและดูเหมือนว่าจะเป็นเพียงข้อบกพร่องที่จะได้รับการแก้ไขในภายหลัง
ในการดูข้อความบันทึกของคุณคุณไปที่Window
-> Devices
ในแถบด้านบนและเลือกอุปกรณ์ของคุณ คุณสามารถเปิดบันทึกอุปกรณ์ได้จากด้านล่างของหน้าต่างนั้น หากคุณกำลังทดสอบในจำลองคุณสามารถใช้ @ BalestraPatrick ของคำตอบ
ข้อบกพร่องบางอย่างได้รับการแก้ไขแล้วในเบต้า 2 และฉันเดาว่าในที่สุดดีบั๊กจะแนบโดยอัตโนมัติเมื่อเปิดส่วนขยาย
อัปเดต:ในบันทึกประจำรุ่น iOS 8 Beta 4 :
ส่วนขยาย
แก้ไขในเบต้า 4
- บางครั้งส่วนขยายไม่สามารถเปิดได้เมื่อทำการดีบักจาก Xcode
- เมื่อส่วนขยายที่มี UI ถูกฆ่ามันจะเปิดขึ้นมาใหม่และไม่ถูกปิด
- บางครั้งส่วนขยายการแชร์หรือการดำเนินการของคุณอาจหยุดทำงาน
- การปรับใช้ส่วนขยายซ้ำอาจปิดใช้งานในศูนย์การแจ้งเตือน
ฉันมีปัญหานี้เหมือนกัน Xcode ไม่แนบดีบักเกอร์ของฉันกับส่วนขยายหรือแสดงข้อความ NSLog หากคุณแนบโปรแกรมแก้ไขจุดบกพร่อง Xcode เข้ากับกระบวนการส่วนขยายของคุณด้วยตนเองอย่างน้อยเบรกพอยต์ก็ทำงานได้อย่างมีเสน่ห์:
Debug->Attach to process->Your extension name (mine was "com.example.MyExtensionApp.MyExtension")
ได้ผลสำหรับฉัน :)
NSLog
จะใช้ได้เฉพาะเมื่อคุณใช้งานแอปคอนเทนเนอร์ มันจะไม่ทำงานหากคุณกำลังใช้งานแอปพลิเคนามสกุลแทนของภาชนะ
Xcode 8 สามารถแก้จุดบกพร่องส่วนขยาย:
ผลลัพธ์: เบรกพอยต์และบันทึกทำงานตามปกติ
ในที่สุดสิ่งที่ทำให้ฉันเห็นบันทึกในพื้นที่ดีบักตามคำแนะนำของ Michaelและเอกสารของ Appleคือ:
สร้างและเรียกใช้ส่วนขยายแอปในเครื่องจำลองและเมื่อได้รับแจ้งสำหรับแอปโฮสต์ให้เลือกแอปเฉพาะที่คุณจะเรียกใช้ส่วนขยายนั้น ในกรณีของฉันฉันกำลังเปิดตัวส่วนขยายการดำเนินการจาก Safari โดยดึงแผ่นงานแบ่งปันบน PDF
สิ่งที่ไม่ได้ผลก่อนหน้านี้คือทำตามคำแนะนำของคนอื่นในการใช้ Today เป็นโฮสต์ แต่จากนั้นออกจากแอปนั้นและไปที่ Safari เพื่อเรียกส่วนขยายของฉัน ฉันไม่จำเป็นต้องเรียกใช้แอปที่มีของฉันก่อนอีกต่อไปก่อนที่จะเรียกใช้ส่วนขยาย
จากเอกสารของ Apple:
ในขั้นตอนการรันของโครงร่างส่วนขยายของคุณคุณระบุแอปโฮสต์เป็นปฏิบัติการได้ เมื่อเข้าถึงส่วนขยายผ่าน UI ของโฮสต์ที่ระบุดีบักเกอร์ Xcode จะแนบกับส่วนขยาย
จริงๆแล้วฉันมีบันทึกเพื่อให้ทำงานได้ค่อนข้างง่ายใน Xcode 6.3 ประการแรกสร้างและเรียกใช้แอพที่มี เมื่อแอปที่มีอยู่ทำงานบนอุปกรณ์แล้วให้สร้างและเรียกใช้ส่วนขยายแอปโดยเปลี่ยนโครงร่างเป็นส่วนขยายแอป
Apple มีเอกสารที่เกี่ยวข้องโดยตรงกับการแก้ไขจุดบกพร่องการสร้างโปรไฟล์และการทดสอบส่วนขยายแอปของคุณ
เคล็ดลับที่เหมาะกับฉัน (แม้ว่ามันจะค่อนข้างน่าเกลียดก็ตาม) คือวางหุ่นจำลองUILabel
ไว้ที่มุมล่างของส่วนขยายของฉัน logLabel
ผมมักจะเรียกว่า จากนั้นเป็นไปได้ที่จะอัปเดตข้อความของป้ายกำกับนี้ด้วยคำสั่งบันทึกใด ๆ ที่คุณต้องการบันทึก แนวทางดังกล่าวไม่ดีมากหากคุณต้องการบันทึกข้อความจากอินสแตนซ์ของคลาสต่างๆ และเห็นได้ชัดว่ามันเกะกะ UI ของคุณ
อย่างไรก็ตามหากคุณมีวิดเจ็ตที่ค่อนข้างเรียบง่ายและคุณไม่ใส่ใจกับความยุ่งเหยิงเล็กน้อยของ UI สิ่งนี้จะเป็นเคล็ดลับ ฉันได้ลองวิธีแก้ปัญหาอื่น ๆ ทั้งหมดที่ระบุไว้ในการสนทนานี้และน่าเศร้าที่ไม่มีวิธีใดที่ใช้ได้ผลกับฉัน
วิธีเดียวที่การดีบักใช้ได้ผลสำหรับฉันคือการเลือก Debug-> Attach To Process By PID หรือ Name จากนั้นป้อนPIDไม่ใช่ชื่อส่วนขยาย คุณสามารถค้นหา PID ได้โดยเรียกใช้ส่วนขยายบนอุปกรณ์ไปที่ Window-> Devices ค้นหาอุปกรณ์ของคุณและดูคอนโซล เมื่อคุณเห็นชื่อนามสกุลของคุณตามด้วยหมายเลข 5 หลัก นั่นคือ PID
ฉันยังใส่ NSLog จำนวนหนึ่งในส่วนขยายเพื่อค้นหา PID ด้วย นี่คือบน xCode 7
พบปัญหาเดียวกันเกี่ยวกับส่วนขยายสำหรับNSLog
และจุดพัก ฉันต่อสู้กับมันมาหลายวันแล้ว
Device log
ได้ดังภาพต่อไปนี้ มันอยู่ที่XCode -> Window -> Devices and Simulators
.
หลังจากป้อนOpen Console
แล้วจะมีช่องค้นหาที่ด้านบนขวาของกล่องโต้ตอบ ฉันสามารถใช้กฎตัวกรองที่นั่นได้ ตัวอย่างเช่นชื่อกระบวนการมีNotification
คำสำคัญหรือชื่อกระบวนการต้องเท่ากับชื่อของเป้าหมายส่วนขยายเช่น: เท่ากับMyNotificationServiceExtension
ชื่อกระบวนการ
เห็นได้ชัดว่ามีบางอย่างเสียใน Xcode6-B5
หากฉันพยายามเรียกใช้ส่วนขยายรูปภาพบนโปรแกรมจำลองฉันไม่เห็น Photos.app ใด ๆ เป็นตัวเลือกสำหรับกระบวนการแนบส่วนขยาย
เหมือนกันทำงานบนอุปกรณ์จริงให้ฉันมีพฤติกรรมที่ถูกต้อง
ในกรณีแรกจุดพักใด ๆ จะไม่ได้รับการรับรอง ในกรณีหลังเบรกพอยต์ทำงานเหมือนเสน่ห์
คุณควรทราบว่าแอปคอนเทนเนอร์และส่วนขยายเป็นสองกระบวนการที่แตกต่างกันโดยสิ้นเชิงใน iOS ในขณะที่ LLVM ดีบักเธรดเพียงครั้งละหนึ่งเธรดดังนั้นเมื่อคุณกำลังดีบักคอนโซลจะไม่บันทึกส่วนขยายและไม่หยุดที่เบรกพอยต์
คุณสามารถแก้ปัญหาส่วนใหญ่ได้ด้วยวิธีการของ @Vince Yuan
อย่างไรก็ตามปัญหาของฉันคือตัวแก้จุดบกพร่อง Xcode แทบจะไม่เชื่อมต่อกับส่วนขยายแป้นพิมพ์ของฉันทั้งบน iOS Simulator และอุปกรณ์เช่น 1 ครั้งใน 7-8 ครั้งมันเป็นเรื่องของความน่าจะเป็นโดยสิ้นเชิง วิธีการของ @Vince Yuan ยังใช้ได้ผลในบางครั้ง
ประสบการณ์เล็กน้อยของฉันคือเมื่อคุณเรียกใช้โครงการดีบักหากเซสชันดีบักในแผงด้านซ้ายแสดงว่า 'ไม่มีเซสชันดีบัก' ไม่จำเป็นต้องเปิดส่วนขยายของคุณและทดสอบตัวแก้ไขข้อบกพร่องไม่ได้เชื่อมต่อเพียงแค่เรียกใช้ โชคดีอีกครั้ง
แต่เมื่อคุณเห็น com.xxx.xxx.xxx กำลังรอที่จะแนบส่วนขยายสามารถแก้ไขข้อบกพร่องได้อย่างแน่นอน
นี่เป็นเคล็ดลับเล็กน้อยสำหรับผู้ที่ไม่สามารถแก้ไขข้อบกพร่องส่วนขยาย iOS โดยเฉพาะส่วนขยายแป้นพิมพ์
ตั้งแต่ Xcode 6 Beta 5 ฉันสามารถใช้อุปกรณ์จริงที่ใช้ iOS8 เพื่อแก้ไขข้อบกพร่องส่วนขยายของฉันได้ ลองรันบนอุปกรณ์และเลือก Safari เพื่อเปิดใช้งาน
เพื่อเอาชนะสถานะทั้งหมดที่เกิดจากการเปลี่ยน IDE ฉันใช้ iOS Console โดย lemonjar.com ซึ่งจะแสดงหน้าต่างคอนโซลสำหรับอุปกรณ์ iOS ที่เชื่อมต่อใด ๆ ที่แสดงข้อความ syslog โดยไม่คำนึงถึงรหัสกระบวนการ คุณสามารถดูข้อความบันทึกการแก้ไขข้อบกพร่องของแอปและส่วนขยายพร้อมกันได้ที่นี่
ฉันสามารถดีบักส่วนขยายของฉันด้วยวิธีที่ฉันอธิบายด้านล่าง:
Debug
-> Attach to process by PID or Name
. ชื่อโครงร่างส่วนขยายของคุณmain app target
และเรียกใช้ฉันหวังว่ามันจะเหมาะกับพวกคุณด้วย