วิธีแก้จุดบกพร่องส่วนขยาย iOS 8 ด้วย NSLog


90
- (void)viewDidLoad
{
    NSLog(@"%s", __func__);
    // ...
}

ในviewDidLoadของ iOS 8 ส่วนขยาย NSLogอะไรเอาท์พุทใน Xcode NSLogทำงานได้ตามปกติในแอปคอนเทนเนอร์

ฉันจะรับผลลัพธ์จากข้อความดีบักจากส่วนขยายได้อย่างไร


ฉันมีปัญหานี้เหมือนกัน บางที NSLog อาจเสีย ฉันใช้เบรกพอยต์เพื่อดีบักค่าในขณะนี้ แต่พวกเขาก็มีปัญหาเหมือนกัน
gallileo

ฉันมีปัญหาคล้ายกันที่ดีบักเกอร์ไม่เคยติดและมักจะพูดว่า "กำลังรอแนบ" ใน Xcode น่าเสียดายที่ฉันไม่เห็นการใช้ประโยชน์ใด ๆ จาก googling และโพสต์คำถามที่นี่ใน Stack โดยยังไม่มีคำตอบ
Alex Bollbach

คำตอบ:


96
  1. การดีบักใช้ได้กับส่วนขยายแอป
  2. มันทำงานบนโปรแกรมจำลองด้วย
  3. หากส่วนขยายแอปของคุณขัดข้องในโปรแกรมจำลองคุณอาจพบว่าการรีสตาร์ทแอปส่วนขยายของแอปนั้นไม่ใช่เรื่องง่าย การรีสตาร์ทโปรแกรมจำลองของคุณเป็นวิธีแก้ปัญหาที่รวดเร็ว
  4. ขั้นตอนในการแก้ไขข้อบกพร่องส่วนขยายแอป:

    1. เรียกใช้แอปคอนเทนเนอร์ ในขั้นตอนนี้ Xcode จะอัปโหลดแอปคอนเทนเนอร์และส่วนขยายแอปไปยังอุปกรณ์หรือโปรแกรมจำลอง

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

    3. ใน Xcode ให้กดเมนู Debug -> Attach to Process -> By Process Identifer (PID) หรือ Name ... ป้อนตัวระบุของแอพ ext เช่น com.abc.ContainerApp.MyExtension เพื่อเริ่มการดีบัก อย่าลืมกำหนดจุดพัก (อัปเดตเมื่อ 25 ส.ค. 2557: คุณสามารถป้อน MyExtension (ชื่อนามสกุลของคุณ) ได้โดยตรง)

    4. ในอุปกรณ์หรือโปรแกรมจำลองให้เปิดส่วนขยายแอปของคุณ


อัปเดตเมื่อ 23 ส.ค. 2557:

ฉันพบว่าขั้นตอนการดีบักด้านบนทำงานได้ไม่ดีใน Xcode 6 beta 6 กับ iOS 8 SDK beta 5 บนเครื่องจำลอง

วิธีการแก้:

  1. เรียกใช้ส่วนขยายของคุณในโปรแกรมจำลอง
  2. Xcode menu Debug -> Attach to Process -> เลือก "MyExtension (your extension's name)" ในส่วน System ในเมนู

เบรกพอยต์ทำงาน แต่ฉันไม่รู้ว่าทำไมบันทึกไม่แสดงในหน้าต่างเอาต์พุต


8
วิธีที่ง่ายที่สุดในการดีบัก (และดู NSLog) ที่ฉันพบคือทำตามขั้นตอนนี้: /// 1 /// เลือกสคีมาแอปคอนเทนเนอร์และเรียกใช้ /// 2 /// เมื่อเปิดใช้งานแล้วให้สลับกลับไปที่ XCode และ (โดยไม่ต้องกดปุ่ม Stop) เลือกสคีมาส่วนขยายจากนั้นกดปุ่ม Run /// 3 /// เมื่อได้รับแจ้งให้เลือกแอปที่จะเรียกใช้ให้เลือกวันนี้ /// 4 /// ตอนนี้เบรกพอยต์และ NSLog ควรทำงานได้โดยไม่มีปัญหา
ขัดจังหวะ

1
แม้วันนี้จะใช้งานไม่ได้โดยเฉพาะอย่างยิ่งหลังจากเกิดเหตุขัดข้อง มันน่ารำคาญมากฉันไม่เข้าใจว่าทำไมถึงแก้ไขยาก
Cristi Băluță

3
ฉันพยายามใช้คำแนะนำที่อัปเดตด้านบนและได้ผลสำหรับฉัน อย่างไรก็ตามในขั้นตอนที่ 2 แทนที่จะใช้ชื่อส่วนขยายของฉันฉันใช้ "By Process Identifier (PID) หรือ Name ... " และป้อน pid ของกระบวนการ สิ่งนี้ทำให้ฉันใช้จุดพักได้อย่างน่าอัศจรรย์
tony.tc.leung

Debug> Attach To Process โดย PID หรือชื่อ: ในช่องข้อความให้ป้อนชื่อกระบวนการในตัวนำทางการดีบักเช่น com.company.AppName.AppName-ExtensionName
TigerCoding

คำตอบนี้ไม่เกี่ยวข้องกับคำถาม OP กำลังถามว่าเหตุใดข้อความ NSLog จึงไม่ถูกเขียนลงในคอนโซลในส่วนขยาย (ข้อกังวลที่ถูกต้องเมื่อฉันมาที่หน้านี้พร้อมกับคำถามเดียวกัน) เขาไม่ได้พูดถึงปัญหาในการเชื่อมต่อกับดีบักเกอร์
Joey Carson

49

ฉันมีปัญหานี้เหมือนกัน มันใช้ได้กับฉันถ้าคุณเข้าไปใน Simulator ของคุณภายใต้เมนู Debug -> Open System Log ...

จากที่นี่คุณจะเห็นบันทึกทั้งหมดของ iPhone Simulator (รวมถึงบันทึกส่วนขยายของคุณ)

ป้อนคำอธิบายภาพที่นี่


มันจะเปิด"~ / Library / Logs / CoreSimulator / <DEVICE_IDENTIFIER> /system.log"เพื่อให้คุณสามารถค้นหาบันทึกอุปกรณ์จำลองอื่น ๆ ทั้งหมดของคุณได้อย่างง่ายดายเพียงแค่แทนที่ <DEVICE_IDENTIFIER>ด้วยรหัสอุปกรณ์จำลอง
Hofi

32

NSLogคือการทำงานอย่างสมบูรณ์แบบ

คุณไม่เห็นสิ่งที่กำลังบันทึกอยู่ในพื้นที่ดีบักของ Xcode เนื่องจากตัวดีบัก Xcode ไม่ได้แนบกับส่วนขยายของคุณ ส่วนขยายเกือบทั้งหมดเป็นอิสระจากแอปที่มีอยู่ ตัวอย่างเช่นมีตัวระบุบันเดิลแยกต่างหากและยังเป็นกระบวนการแยกต่างหากบนระบบปฏิบัติการ

ฉันประสบความสำเร็จหลายประการในการรับ Xcode เพื่อแนบกับส่วนขยาย ดูเหมือนว่ามันจะแนบโดยอัตโนมัติและปรากฏในเนวิเกเตอร์การดีบักว่า "กำลังรอการแนบ" แต่จะไม่ติด

บางครั้งฉันสามารถเรียกใช้เป้าหมายส่วนขยายของฉันใน Xcode:

ป้อนคำอธิบายภาพที่นี่

จากนั้นมีตัวเลือกให้เลือกแอปพลิเคชันที่จะเรียกใช้ส่วนขยายของฉันในกรณีนี้ฉันจะเลือกคำแนะนำ "วันนี้" ซึ่งเป็นศูนย์การแจ้งเตือน

ป้อนคำอธิบายภาพที่นี่

จากนั้นบางครั้งก็จะแนบดีบักเกอร์กับส่วนขยายของฉัน โปรดทราบว่าวิธีนี้ใช้ได้กับอุปกรณ์ทางกายภาพเท่านั้นดูเหมือนว่า

หากไม่แนบคุณสามารถใช้วิธีการแนบด้วยตนเองในคำตอบของ @ VinceYaun

ฉันยังประสบความสำเร็จหลายประการโดยใช้วิธีการแนบอื่น ๆ ส่วนใหญ่ไม่ประสบความสำเร็จและดูเหมือนว่าจะเป็นเพียงข้อบกพร่องที่จะได้รับการแก้ไขในภายหลัง

ในการดูข้อความบันทึกของคุณคุณไปที่Window-> Devicesในแถบด้านบนและเลือกอุปกรณ์ของคุณ คุณสามารถเปิดบันทึกอุปกรณ์ได้จากด้านล่างของหน้าต่างนั้น หากคุณกำลังทดสอบในจำลองคุณสามารถใช้ @ BalestraPatrick ของคำตอบ

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

อัปเดต:ในบันทึกประจำรุ่น iOS 8 Beta 4 :

ส่วนขยาย

แก้ไขในเบต้า 4

  • บางครั้งส่วนขยายไม่สามารถเปิดได้เมื่อทำการดีบักจาก Xcode
  • เมื่อส่วนขยายที่มี UI ถูกฆ่ามันจะเปิดขึ้นมาใหม่และไม่ถูกปิด
  • บางครั้งส่วนขยายการแชร์หรือการดำเนินการของคุณอาจหยุดทำงาน
  • การปรับใช้ส่วนขยายซ้ำอาจปิดใช้งานในศูนย์การแจ้งเตือน

คุณได้ลองใช้แนวทางเดียวกันกับ Storage Extensions หรือไม่?
SRP-Achiever

มันไม่ได้ผลสำหรับฉันใน Xcode 6 beta 2 แต่Vince Yuan ตอบได้ น่าเสียดายที่ในการดีบักส่วนขยาย Xcode 6 beta 3 ไม่ได้ผลสำหรับฉันเลย ฉันไม่พบวิธีแก้ปัญหานั้นอาจต้องรอการเผยแพร่ครั้งต่อไป
Darrarski

@Darrarski คำตอบของฉันเหลือจาก Beta 1 FYI เบต้า 3 หมดแล้วดังนั้นคุณควรจะดำเนินการต่อในตอนนี้
ซานตาคลอส

@ ซานตาคลอสสวยใส. ความคิดเห็นของฉันคือการแจ้งว่าไม่มีโซลูชันใดที่ใช้งานได้ใน Xcode 6 beta 3 สำหรับฉัน ดูเหมือนว่าการดีบักส่วนขยายจะเสียมากกว่าในรุ่นนี้ หวังว่าเบต้าต่อไปจะแก้ไขปัญหาได้
Darrarski

3
ไม่มีข้อบกพร่องใดที่ฉันได้รับการแก้ไขในเบต้า 4 (ตอนนี้คือเบต้า 5)
แมตต์

18

ฉันมีปัญหานี้เหมือนกัน Xcode ไม่แนบดีบักเกอร์ของฉันกับส่วนขยายหรือแสดงข้อความ NSLog หากคุณแนบโปรแกรมแก้ไขจุดบกพร่อง Xcode เข้ากับกระบวนการส่วนขยายของคุณด้วยตนเองอย่างน้อยเบรกพอยต์ก็ทำงานได้อย่างมีเสน่ห์:

Debug->Attach to process->Your extension name (mine was "com.example.MyExtensionApp.MyExtension")

5
ฉันมีโชคผสมกับสิ่งนี้
ซานตาคลอส

2
upvote แต่ไม่ได้ผลเสมอไปหวังว่า apple จะสามารถแนบ debugger กับส่วนขยายในอนาคตได้โดยอัตโนมัติ
จิง

14
  1. สร้างรูปแบบสำหรับส่วนขยายของคุณ
  2. รันแบบแผน
  3. ในกล่องโต้ตอบให้เลือกแอปคอนเทนเนอร์
  4. สนุก

ได้ผลสำหรับฉัน :)


นี่คือสิ่งที่ฉันต้องการ
pob21

1
NSLogจะใช้ได้เฉพาะเมื่อคุณใช้งานแอปคอนเทนเนอร์ มันจะไม่ทำงานหากคุณกำลังใช้งานแอปพลิเคนามสกุลแทนของภาชนะ
JaredH

สิ่งนี้ได้ผลสำหรับฉันเช่นกัน ขอบคุณ Maciek Czarnik! วิธีแก้ปัญหาข้างต้นไม่ได้ผลสำหรับฉัน ฉันใช้ Xcode 8.1
plam4u

5

Xcode 8 สามารถแก้จุดบกพร่องส่วนขยาย:

  1. เลือกโครงร่างส่วนขยายในคำสั่งผสมถัดจากปุ่มหยุดและเรียกใช้
  2. เลือกแอปพลิเคชันหลักในกล่องโต้ตอบที่ปรากฏขึ้น

ผลลัพธ์: เบรกพอยต์และบันทึกทำงานตามปกติ


2
ไม่ทำงานในกรณีของส่วนขยายวันนี้ของฉัน ได้รับข้อผิดพลาด CLANG: ld: ไม่พบไลบรารีสำหรับ -lRPush clang: ข้อผิดพลาด: คำสั่ง linker ล้มเหลวด้วยรหัสออก 1 (ใช้ -v เพื่อดูการเรียก)
BadmintonCat

นี่เป็นข้อผิดพลาดที่ไม่เกี่ยวข้อง คุณกำลังพยายามเชื่อมโยงไปยังไลบรารีที่หายไป เพิ่ม Liferay-Push ให้กับเป้าหมายของคุณ
โน่

5

ในที่สุดสิ่งที่ทำให้ฉันเห็นบันทึกในพื้นที่ดีบักตามคำแนะนำของ Michaelและเอกสารของ Appleคือ:

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

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

จากเอกสารของ Apple:

ในขั้นตอนการรันของโครงร่างส่วนขยายของคุณคุณระบุแอปโฮสต์เป็นปฏิบัติการได้ เมื่อเข้าถึงส่วนขยายผ่าน UI ของโฮสต์ที่ระบุดีบักเกอร์ Xcode จะแนบกับส่วนขยาย


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

1

จริงๆแล้วฉันมีบันทึกเพื่อให้ทำงานได้ค่อนข้างง่ายใน Xcode 6.3 ประการแรกสร้างและเรียกใช้แอพที่มี เมื่อแอปที่มีอยู่ทำงานบนอุปกรณ์แล้วให้สร้างและเรียกใช้ส่วนขยายแอปโดยเปลี่ยนโครงร่างเป็นส่วนขยายแอป

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


1

เคล็ดลับที่เหมาะกับฉัน (แม้ว่ามันจะค่อนข้างน่าเกลียดก็ตาม) คือวางหุ่นจำลองUILabelไว้ที่มุมล่างของส่วนขยายของฉัน logLabelผมมักจะเรียกว่า จากนั้นเป็นไปได้ที่จะอัปเดตข้อความของป้ายกำกับนี้ด้วยคำสั่งบันทึกใด ๆ ที่คุณต้องการบันทึก แนวทางดังกล่าวไม่ดีมากหากคุณต้องการบันทึกข้อความจากอินสแตนซ์ของคลาสต่างๆ และเห็นได้ชัดว่ามันเกะกะ UI ของคุณ

อย่างไรก็ตามหากคุณมีวิดเจ็ตที่ค่อนข้างเรียบง่ายและคุณไม่ใส่ใจกับความยุ่งเหยิงเล็กน้อยของ UI สิ่งนี้จะเป็นเคล็ดลับ ฉันได้ลองวิธีแก้ปัญหาอื่น ๆ ทั้งหมดที่ระบุไว้ในการสนทนานี้และน่าเศร้าที่ไม่มีวิธีใดที่ใช้ได้ผลกับฉัน


1

วิธีเดียวที่การดีบักใช้ได้ผลสำหรับฉันคือการเลือก Debug-> Attach To Process By PID หรือ Name จากนั้นป้อนPIDไม่ใช่ชื่อส่วนขยาย คุณสามารถค้นหา PID ได้โดยเรียกใช้ส่วนขยายบนอุปกรณ์ไปที่ Window-> Devices ค้นหาอุปกรณ์ของคุณและดูคอนโซล เมื่อคุณเห็นชื่อนามสกุลของคุณตามด้วยหมายเลข 5 หลัก นั่นคือ PID

ฉันยังใส่ NSLog จำนวนหนึ่งในส่วนขยายเพื่อค้นหา PID ด้วย นี่คือบน xCode 7


1

พบปัญหาเดียวกันเกี่ยวกับส่วนขยายสำหรับNSLogและจุดพัก ฉันต่อสู้กับมันมาหลายวันแล้ว

Device logได้ดังภาพต่อไปนี้ มันอยู่ที่XCode -> Window -> Devices and Simulators.

หลังจากป้อนOpen Consoleแล้วจะมีช่องค้นหาที่ด้านบนขวาของกล่องโต้ตอบ ฉันสามารถใช้กฎตัวกรองที่นั่นได้ ตัวอย่างเช่นชื่อกระบวนการมีNotificationคำสำคัญหรือชื่อกระบวนการต้องเท่ากับชื่อของเป้าหมายส่วนขยายเช่น: เท่ากับMyNotificationServiceExtensionชื่อกระบวนการ

บันทึกอุปกรณ์


0

เห็นได้ชัดว่ามีบางอย่างเสียใน Xcode6-B5

หากฉันพยายามเรียกใช้ส่วนขยายรูปภาพบนโปรแกรมจำลองฉันไม่เห็น Photos.app ใด ๆ เป็นตัวเลือกสำหรับกระบวนการแนบส่วนขยาย

ตัวเลือกการดีบักภายในโปรแกรมจำลอง

เหมือนกันทำงานบนอุปกรณ์จริงให้ฉันมีพฤติกรรมที่ถูกต้อง

ตัวเลือกการดีบักด้วยอุปกรณ์จริง

ในกรณีแรกจุดพักใด ๆ จะไม่ได้รับการรับรอง ในกรณีหลังเบรกพอยต์ทำงานเหมือนเสน่ห์


0

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

คุณสามารถแก้ปัญหาส่วนใหญ่ได้ด้วยวิธีการของ @Vince Yuan

อย่างไรก็ตามปัญหาของฉันคือตัวแก้จุดบกพร่อง Xcode แทบจะไม่เชื่อมต่อกับส่วนขยายแป้นพิมพ์ของฉันทั้งบน iOS Simulator และอุปกรณ์เช่น 1 ครั้งใน 7-8 ครั้งมันเป็นเรื่องของความน่าจะเป็นโดยสิ้นเชิง วิธีการของ @Vince Yuan ยังใช้ได้ผลในบางครั้ง

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

แต่เมื่อคุณเห็น com.xxx.xxx.xxx กำลังรอที่จะแนบส่วนขยายสามารถแก้ไขข้อบกพร่องได้อย่างแน่นอน

นี่เป็นเคล็ดลับเล็กน้อยสำหรับผู้ที่ไม่สามารถแก้ไขข้อบกพร่องส่วนขยาย iOS โดยเฉพาะส่วนขยายแป้นพิมพ์


0

ตั้งแต่ Xcode 6 Beta 5 ฉันสามารถใช้อุปกรณ์จริงที่ใช้ iOS8 เพื่อแก้ไขข้อบกพร่องส่วนขยายของฉันได้ ลองรันบนอุปกรณ์และเลือก Safari เพื่อเปิดใช้งาน


0

เพื่อเอาชนะสถานะทั้งหมดที่เกิดจากการเปลี่ยน IDE ฉันใช้ iOS Console โดย lemonjar.com ซึ่งจะแสดงหน้าต่างคอนโซลสำหรับอุปกรณ์ iOS ที่เชื่อมต่อใด ๆ ที่แสดงข้อความ syslog โดยไม่คำนึงถึงรหัสกระบวนการ คุณสามารถดูข้อความบันทึกการแก้ไขข้อบกพร่องของแอปและส่วนขยายพร้อมกันได้ที่นี่


0

ฉันสามารถดีบักส่วนขยายของฉันด้วยวิธีที่ฉันอธิบายด้านล่าง:

  1. Xcode : Debug-> Attach to process by PID or Name. ชื่อโครงร่างส่วนขยายของคุณ
  2. จากนั้นเลือกของคุณmain app targetและเรียกใช้

ฉันหวังว่ามันจะเหมาะกับพวกคุณด้วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.