Console ใน Xcode เป็นเครื่องมือการดีบักสำหรับการพัฒนา iOS ที่แสดงผลลัพธ์ของ NSLog, print, os_log และบันทึกข้อขัดองแอพแบบเวลาจริง ตาม Apple Unified Logging ตั้งแต่ iOS 10 Apple แนะนำให้ใช้ os_log แทน NSLog สำหรับการรวบรวมข้อความแบบรวมศูนย์ผ่าน Unified Logging System Console รวมผลลัพธ์ของตัวดีบักและข้อความระบบไว้ในหน้าต่าง Debug Area เดียว สามารถเข้าถึงได้ตลอดทุกขณะของการพัฒนา
ประเด็นสำคัญ
Console เป็นส่วนหนึ่งของ Debug Area ใน Xcode ที่อยู่ในแผงด้านล่างของโปรแกรมแก้ไข (View → Debug Area → Activate Console, แป้นลัด Cmd + Shift + Y) Console แสดงผลลัพธ์ข้อความทั้งหมดจากแอพลิเคชันที่กำลังทำงาน: ข้อความจาก NSLog, os_log, print, คำเตือนขณะทำงาน และการดังข้อมูลข้อยกเว้นโดยอัตโนมัติเมื่อแอพพัง
Console ทำงาน ทั้งในโปรแกรมจำลองและบนอุปกรณ์จริง ในโปรแกรมจำลอง ข้อความจะมาถึงทันทีผ่านท่อเลียงท้องถิ่น บนอุปกรณ์ ข้อความจะมาผ่านการเชื่อมต่อ USB โดยมีความล่าช้า 1–3 เฟรม สำหรับแอพผลิต Console บนอุปกรณ์ไม่พร้อมใช้งาน — นักพัฒนาอาศัย Crashlytics หรือ Unified Logging พร้อมการรวบรวมระยะไกลผ่าน log collect
ต่างจากแอพลิเคชันระบบ Console.app บน Mac หน้าต่าง Console ใน Xcode แสดงเฉพาะบันทึกของแอพลิเคชันที่กำลังทำงานอยู่ (เพื่อความสามารถในการกรอง) Console.app รวบรวมบันทึกของทุกโปรเซสบน Mac รวมถึงโปรแกรมจำลอง iOS อย่างไรก็ตาม สำหรับการดีบักแอพ iOS นักพัฒนาใช้ Console ในตัวของ Xcode เนื่องจากการผนวกานกับตัวดีบักเกอร์ LLDB
API หลักสามตัว มีให้สำหรับนักพัฒนา iOS ในการแสดงผลใน Console: NSLog (ล้าสมัย), os_log (แนะนำ) และ print (Swift เท่านั้น) แต่ละตัวมีลักษณะเฉพาะของตนเองในแง่ของประสิทธิภาพ การจัดรูปแบบ และความเข้ากันได้กับ Unified Logging System
NSLog เป็นฟังก์ชันจาก Foundation ที่มีใน Objective-C และ Swift NSLog แสดงข้อความพร้อมแสตมป์เวลา ชื่อโปรเซส และ PID ข้อเสีย: NSLog เขียนไปยังบัฟเฟอร์ระบบแบบซิงค์โครนัส ทำให้บล็อกเธรดปัจจุบันในระหว่างการเขียน ด้วยการเรียกใช้บ่อย (เช่น ในลูป) NSLog สร้างความล่าช้าที่เห็นได้ชัดเจน Apple ไม่แนะนำ NSLog สำหรับโปรเจคใหม่ แต่ไม่ยังคงความเข้ากันได้กับโค้ดเก่าและไลบรารีบุคคลที่สาม
os_log เป็น API จาก os.framework ที่นำมาใช้ใน iOS 10 os_log ทำงานแบบไม่พร้อมกัน: ข้อความจะถูกเข้าค์ในคิวและเขียนไปยังบัฟเฟอร์โดยไม่ต้องบล็อกเธรดที่เรียกใช้ ตาม WWDC 2016 os_log เร็วกว่า NSLog ถึง 50 เท่าในสถานการณ์ที่มีโหลดสูง os_log ยังรองรับการควบคุมแบบไดนามิก: ข้อความระดับ DEBUG จะถูกรวบรวมในบิลด์ Debug เท่านั้น และใน Release จะถูกละเว้นโดยไม่มีค่าใช้จ่าย
print() เป็นวิธีการแสดงผลที่ง่ายที่สุดใน Swift print เขียนไปยัง stdout (ผลลัพธ์มาตรฐาน) ซึ่ง Xcode เลียงไปยัง Console print ไม่เพิ่มเมตาดาต้า (เวลา ระดับ) แต่รองรับการบัฟเฟอร์ stdout สำหรับการดีบักอย่างรวดเร็ว print เป็นเครื่องมือที่สะดวก แต่สำหรับการบันทึกถาวร print ด้อยกว่า os_log ในด้านฟังก์ชันและการควบคุม
import os.log
// NSLog — ล้าสมัย, บล็อก
NSLog("Application started")
// os_log — แนะนำ, ไม่พร้อมกัน
let log = OSLog(
subsystem: "com.myapp",
category: "lifecycle"
)
os_log("Application started", log: log)
// print — ผลลัพธ์ Swift ที่รวดเร็ว
print("Application started")
Unified Logging System (ULS) เป็นโครงสร้างพื้นฐานการบันทึกแบบครบวงจรของ Apple ที่นำมาใช้ใน iOS 10 และ macOS Sierra ULS รวบรวมข้อความจากทุกโปรเซสของระบบไว้ในพื้นที่เก็บข้อมูลเดียวโดยสามารถเข้าถึงแบบระยะไกลผ่านเครื่องมือบรรทัดคำสั่ง log บน Mac นักพัฒนาใช้ os_log สำหรับเขียนไปยัง ULS และ Console สำหรับอ่าน
แต่ละ OSLog จะถูกระบุโดยคู่ subsystem (เช่น com.myapp.network) และ category (เช่น http, websocket) ระบบย่อยคือโดมเนนแอพลิเคชัน (แอพเดียวสามารถมีหลายระบบย่อยสำหรับโมดูลต่างๆ ได้) หมวดหมู่คือส่วนประกอภายในระบบย่อย การรวม subsystem + category ช่วยให้สามารถกรองบันทึกได้อย่างยืดหยุ่นใน Console และ log collect
| ระดับ | OSLogType | การแสดงผลใน Console | การรวบรวมใน Release |
|---|---|---|---|
| Default | .default | เสมอ | ใช่ |
| Info | .info | เมื่อเปิดใช้งาน UI os_log | ใช่ |
| Debug | .debug | เฉพาะบิลด์ Debug | ไม่ |
| Error | .error | เสมอมีป้ายสีแดง | ใช่ |
| Fault | .fault | เสมอมีป้ายสีม่วง | ใช่ |
คำสั่ง log collect บน Mac รวบรวมบันทึกที่ถูกเก็บไว้จากอุปกรณ์ iOS ที่เชื่อมต่อไว้ในไฟล์ .logarchive ไฟล์นี้สามารถเปิดใน Console.app บน Mac เพื่อวิเคราะห์แบบละเอียด รวมถึงข้อความ os_log บันทึกข้อขัดอง และการวินิจฉัยระบบ สำหรับเปิดใช้การรวบรวมบนอุปกรณ์ จำเป็นต้องเปิดโหมดนักพัฒนาและเชื่อมต่ออุปกรณ์ผ่าน USB
การทำงานเฉาะเรื่องที่ปญาญานิบัญ กับ Console ประกอบด้วยสามสถานการณ์หลัก: การบันทึกแบบเชื่องรักระหว่างการพัฒนา การวิเคราะห์บันทึกข้อขัดองหลังการขัดข้อง และการวินิจฉัยระยะไกลผ่าน .logarchive แต่ละสถานการณ์มีชุดเครื่องมือและการตั้งค่าที่เหมาะสมที่สุด
แนะนำ ให้สร้าง OSLog แยกต่างสำหรับแต่ละโมดูลแอพลิเคชันโดยมีระดับ: debug (การดีบักแบบละเอียด), info (การเปลี่ยนสถานะหลัก), error (ข้อยกเว้นและความล้มเหลว) ใน Console Xcode เปิดใช้ตัวกรองตามระบบย่อยของแอพลิเคชันของคุณเพื่อไม่รวมข้อความระบบที่สร้างสัญหยุกและทำให้เสียสมาธิจากตรรกะแอพ
เมื่อ แอพพัง Xcode จะหยุดการทำงานโดยอัตโนมัติและแสดงเธรดที่เกิดขั้นของข้อขัดอง พร้อมการตามรอยสเต็กเต็มใน Console บรรทัดแรกของบันทึกข้อขัดองมีชนิดข้อยกเว้น (NSException, EXC_BAD_ACCESS) และสาเหตุ ศึกษารอยสเต็กจากล่างขึ้นไปบน: เมธอดสุดท้ายที่ถูกเรียกคือตำแหน่งที่เกิดข้อขัดอง สำหรับที่อยู่ที่ถูกเข้ารหัส (ใน Release) จำเป็นต้องใช้ symbolication ผ่าน dSYM
// ตัวอย่างการกำหนดค่า OSLog แบบโมดูล
extension OSLog {
static let uiLifecycle = OSLog(
subsystem: "com.myapp.ui",
category: "lifecycle"
)
static let network = OSLog(
subsystem: "com.myapp.network",
category: "http"
)
static let database = OSLog(
subsystem: "com.myapp.data",
category: "core-data"
)
}
// การใช้งานกับระดับ
os_log("View did load", log: .uiLifecycle, type: .debug)
os_log("HTTP 200 received", log: .network, type: .info)
os_log("Failed to save: \(error.localizedDescription)",
log: .database, type: .error)
Console Xcode รองรับคุณสมบัติขั้นสูงหลายอย่างที่ไปไกลกว่าการบันทึกทำไปทำมา บันทึกเบรกพอย์นต์ช่วยให้สามารถส่งข้อความไปยัง Console โดยไม่ต้องหยุดการทำงาน และคำสั่ง LLDB ใน Debugger Command ช่วยควบคุมรูปแบบการแสดงผลได้อย่างสมบูรณ์
คุณสามารถ กำหนดค่า breakpoint เพื่อส่งข้อความไปยัง Console และดำเนินการต่อโดยอัตโนมัติ ตั้ง breakpoint ไว้ที่บรรทัดที่ต้องการ คลิกขวา → Edit Breakpoint → เพิ่ม Debugger Command: “po self” หรือ “expr @import UIKit” + Debugger Command: “po self.view” เลือก Automatically continue after evaluating หลังจากเริ่มต้น breakpoint จะส่งผลลัพธ์ของคำสั่งไปยัง Console ทุกครั้งที่ถึงบรรทัด โดยไม่ขัดขวางเธรด
Console Xcode รองรับ การดำเนินการคำสั่ง LLDB ต่างๆ ขณะที่หยุดที่ breakpoint po (print object) แสดงคำอธิบายอบเจกต์ p (print) แสดงค่าประถมูญ และ expr ดำเนินการนิพจน์ Swift/ObjC สำหรัผลลัพธ์ที่มีรูปแบบ ใช้ p/CGRectGetWidth ผลลัพธ์ LLDB จะปรากฏใน Console ทันทีหลังจากถึง breakpoint
func processUserData(user: User) {
// เบรกพอย์นต์ที่นี่ด้วย Debugger Command:
// po "User name: \(user.name)"
// expr user.age = 30
print("Processing user: \(user.name)")
}
// ตัวอย่างการบันทึกแบบกำหนดเองด้วยลำดับ
func trackMethodCall(
file: String = #file,
function: String = #function
) {
os_log("[\(function)] called",
log: .uiLifecycle, type: .debug)
}
Console Xcode ฤกษ์รวมกับ Instruments — เครื่องมือการทำโปรไฟล์ของ Xcode เมื่อรันแอพผ่าน Product → Profile โดยใช้แม่แบบ Logging ข้อความ os_log ทั้งหมดจะถูกบันทึกไว้ในรอยการ Instruments พร้อมแสตมป์เวลา ซึ่งช่วยให้สามารถดูบันทึก ประสิทธิภาพ และเหตุการณ์ระบบได้พร้อมกันบนไลน์เวลาเดียว ซึ่งสำคัญสำหรับการวินิจฉัยภาวะการแข่งขันและการถดถอยประสิทธิภาพ
คำถามที่พบบ่อย
NSLog ทำงานแบบซิงค์โครนัส บล็อกเธรด และแสดงข้อความเสมอ os_log ทำงานแบบไม่พร้อมกัน เร็วกว่า 50 เท่าในสถานการณ์ที่มีโหลดสูง รองรับหมวดหมู่ และปิดเชิงอัตโนมัติระดับดีบักในบิลด์ Release โดยไม่สูญเสียประสิทธิภาพ
ตรวจสอบ ระดับการบันทึก: โดยค่าเริ่มต้น Console แสดงเฉพาะ default และสูงกว่า เพื่อดู info และ debug เปิดเมนู os_log ใน Console Xcode และเลือก Include Info Messages และ Include Debug Messages ในการตั้งค่าสญญา (Edit Scheme → Run → Arguments → OS_ACTIVITY_MODE = debug)
เลือก ข้อความที่ต้องการใน Console คัดลอก (Cmd + C) และวางในโปรแกรมแก้ไขข้อความใดๆ สำหรับการดังข้อมูลที่สมบูรณ์ ใช้คำสั่งเทอร์มินัล: sudo log collect --device --output /tmp/app_logs.logarchive — มันจะบันทึกบันทึกทั้งหมดจากอุปกรณ์ iOS ไว้ในรูปแบบที่มีโครงสร้าง
os_log ชนิด .default และ .error ทำงานใน Release โดยค่าเริ่มต้น สำหรับ .info และ .debug ใน Release คุณจำเป็นต้องเพิ่มอาร์กิวเมนต์เริ่มต้น -OSLogPreferencesApp “$(PRODUCT_BUNDLE_IDENTIFIER):debug” ในโครงสร้าง Xcode หากไม่มีอาร์กิวเมนต์นี้ ข้อความดีบักจะไม่ถูกรวบรวมใน Release ซึ่งประหยัดทรัพยากรของอุปกรณ์
เปิด Window → Organizer → Crashes ใน Xcode ตัวจัดระเบียบแสดงบันทึกข้อขัดองทั้งหมดที่รวบรวมจากอุปกรณ์ของผู้ทดสอบ โดยจัดกลุ่มตามชนิดข้อยกเว้น Symbolication ต้องใช้ไฟล์ .dSYM จากบิลด์ที่เกิดข้อขัดอง — Xcode จะค้นหาโดยอัตโนมัติหากมีไฟล์จัดเก็บ
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม