Console ใน Xcode: แนวคิดหลัก ผลลัพธ์ข้อมูล และการดีบัก

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-05-06 เวลาอ่าน: 8 นาที

Console ใน Xcode เป็นเครื่องมือการดีบักสำหรับการพัฒนา iOS ที่แสดงผลลัพธ์ของ NSLog, print, os_log และบันทึกข้อขัดองแอพแบบเวลาจริง ตาม Apple Unified Logging ตั้งแต่ iOS 10 Apple แนะนำให้ใช้ os_log แทน NSLog สำหรับการรวบรวมข้อความแบบรวมศูนย์ผ่าน Unified Logging System Console รวมผลลัพธ์ของตัวดีบักและข้อความระบบไว้ในหน้าต่าง Debug Area เดียว สามารถเข้าถึงได้ตลอดทุกขณะของการพัฒนา

ประเด็นสำคัญ

  • Console Xcode — หน้าต่าง Debug Area สำหรับดู NSLog, os_log, print และบันทึกข้อขัดอง iOS
  • Unified Logging System — ระบบการบันทึกทีทันสมัยของ Apple พร้อมหมวดหมู่ ระดับ และการเก็บข้อมูลบนแผ่นดิสก์
  • os_log — API การบันทึกทีแนะนำพร้อมการรองรับการกำหนดค่าระดับแบบไดนามิก
  • บันทึกข้อขัดอง จะปรากฏใน Console โดยอัตโนมัติเมื่อแอพพังบนอุปกรณ์หรือโปรแกรมจำลอง
  • บันทึกเบรกพอย์นต์ — ส่งข้อความไปยัง Console โดยไม่ต้องหยุดการทำงานผ่าน Debugger Command

Console ใน Xcode คืออะไร

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 การบันทึก: NSLog, os_log และ print

API หลักสามตัว มีให้สำหรับนักพัฒนา iOS ในการแสดงผลใน Console: NSLog (ล้าสมัย), os_log (แนะนำ) และ print (Swift เท่านั้น) แต่ละตัวมีลักษณะเฉพาะของตนเองในแง่ของประสิทธิภาพ การจัดรูปแบบ และความเข้ากันได้กับ Unified Logging System

NSLog — การบันทึกแบบคลาสสิก

NSLog เป็นฟังก์ชันจาก Foundation ที่มีใน Objective-C และ Swift NSLog แสดงข้อความพร้อมแสตมป์เวลา ชื่อโปรเซส และ PID ข้อเสีย: NSLog เขียนไปยังบัฟเฟอร์ระบบแบบซิงค์โครนัส ทำให้บล็อกเธรดปัจจุบันในระหว่างการเขียน ด้วยการเรียกใช้บ่อย (เช่น ในลูป) NSLog สร้างความล่าช้าที่เห็นได้ชัดเจน Apple ไม่แนะนำ NSLog สำหรับโปรเจคใหม่ แต่ไม่ยังคงความเข้ากันได้กับโค้ดเก่าและไลบรารีบุคคลที่สาม

os_log — มาตรฐานสมัยใหม่

os_log เป็น API จาก os.framework ที่นำมาใช้ใน iOS 10 os_log ทำงานแบบไม่พร้อมกัน: ข้อความจะถูกเข้าค์ในคิวและเขียนไปยังบัฟเฟอร์โดยไม่ต้องบล็อกเธรดที่เรียกใช้ ตาม WWDC 2016 os_log เร็วกว่า NSLog ถึง 50 เท่าในสถานการณ์ที่มีโหลดสูง os_log ยังรองรับการควบคุมแบบไดนามิก: ข้อความระดับ DEBUG จะถูกรวบรวมในบิลด์ Debug เท่านั้น และใน Release จะถูกละเว้นโดยไม่มีค่าใช้จ่าย

print() — ผลลัพธ์เฉพาะ Swift

print() เป็นวิธีการแสดงผลที่ง่ายที่สุดใน Swift print เขียนไปยัง stdout (ผลลัพธ์มาตรฐาน) ซึ่ง Xcode เลียงไปยัง Console print ไม่เพิ่มเมตาดาต้า (เวลา ระดับ) แต่รองรับการบัฟเฟอร์ stdout สำหรับการดีบักอย่างรวดเร็ว print เป็นเครื่องมือที่สะดวก แต่สำหรับการบันทึกถาวร print ด้อยกว่า os_log ในด้านฟังก์ชันและการควบคุม

swift
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: หมวดหมู่ ระดับ และระบบย่อย

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

ระดับการบันทึก OSLog

ระดับOSLogTypeการแสดงผลใน Consoleการรวบรวมใน Release
Default.defaultเสมอใช่
Info.infoเมื่อเปิดใช้งาน UI os_logใช่
Debug.debugเฉพาะบิลด์ Debugไม่
Error.errorเสมอมีป้ายสีแดงใช่
Fault.faultเสมอมีป้ายสีม่วงใช่

log collect — การรวบรวมบันทึกระยะไกล

คำสั่ง log collect บน Mac รวบรวมบันทึกที่ถูกเก็บไว้จากอุปกรณ์ iOS ที่เชื่อมต่อไว้ในไฟล์ .logarchive ไฟล์นี้สามารถเปิดใน Console.app บน Mac เพื่อวิเคราะห์แบบละเอียด รวมถึงข้อความ os_log บันทึกข้อขัดอง และการวินิจฉัยระบบ สำหรับเปิดใช้การรวบรวมบนอุปกรณ์ จำเป็นต้องเปิดโหมดนักพัฒนาและเชื่อมต่ออุปกรณ์ผ่าน USB

การทำงานกับ Console: การดีบักทีละขั้นตอนและการวิเคราะห์บันทึกข้อขัดอง

การทำงานเฉาะเรื่องที่ปญาญานิบัญ กับ Console ประกอบด้วยสามสถานการณ์หลัก: การบันทึกแบบเชื่องรักระหว่างการพัฒนา การวิเคราะห์บันทึกข้อขัดองหลังการขัดข้อง และการวินิจฉัยระยะไกลผ่าน .logarchive แต่ละสถานการณ์มีชุดเครื่องมือและการตั้งค่าที่เหมาะสมที่สุด

การตั้งค่า Console สำหรับการพัฒนา

แนะนำ ให้สร้าง OSLog แยกต่างสำหรับแต่ละโมดูลแอพลิเคชันโดยมีระดับ: debug (การดีบักแบบละเอียด), info (การเปลี่ยนสถานะหลัก), error (ข้อยกเว้นและความล้มเหลว) ใน Console Xcode เปิดใช้ตัวกรองตามระบบย่อยของแอพลิเคชันของคุณเพื่อไม่รวมข้อความระบบที่สร้างสัญหยุกและทำให้เสียสมาธิจากตรรกะแอพ

การวิเคราะห์บันทึกข้อขัดอง

เมื่อ แอพพัง Xcode จะหยุดการทำงานโดยอัตโนมัติและแสดงเธรดที่เกิดขั้นของข้อขัดอง พร้อมการตามรอยสเต็กเต็มใน Console บรรทัดแรกของบันทึกข้อขัดองมีชนิดข้อยกเว้น (NSException, EXC_BAD_ACCESS) และสาเหตุ ศึกษารอยสเต็กจากล่างขึ้นไปบน: เมธอดสุดท้ายที่ถูกเรียกคือตำแหน่งที่เกิดข้อขัดอง สำหรับที่อยู่ที่ถูกเข้ารหัส (ใน Release) จำเป็นต้องใช้ symbolication ผ่าน dSYM

swift
// ตัวอย่างการกำหนดค่า 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 ทุกครั้งที่ถึงบรรทัด โดยไม่ขัดขวางเธรด

คำสั่ง LLDB ใน Console

Console Xcode รองรับ การดำเนินการคำสั่ง LLDB ต่างๆ ขณะที่หยุดที่ breakpoint po (print object) แสดงคำอธิบายอบเจกต์ p (print) แสดงค่าประถมูญ และ expr ดำเนินการนิพจน์ Swift/ObjC สำหรัผลลัพธ์ที่มีรูปแบบ ใช้ p/CGRectGetWidth ผลลัพธ์ LLDB จะปรากฏใน Console ทันทีหลังจากถึง breakpoint

swift
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)
}

การผนวกานกับ Instruments

Console Xcode ฤกษ์รวมกับ Instruments — เครื่องมือการทำโปรไฟล์ของ Xcode เมื่อรันแอพผ่าน Product → Profile โดยใช้แม่แบบ Logging ข้อความ os_log ทั้งหมดจะถูกบันทึกไว้ในรอยการ Instruments พร้อมแสตมป์เวลา ซึ่งช่วยให้สามารถดูบันทึก ประสิทธิภาพ และเหตุการณ์ระบบได้พร้อมกันบนไลน์เวลาเดียว ซึ่งสำคัญสำหรับการวินิจฉัยภาวะการแข่งขันและการถดถอยประสิทธิภาพ

คำถามที่พบบ่อย

ความแตกต่างระหว่าง NSLog และ os_log คืออะไร?

NSLog ทำงานแบบซิงค์โครนัส บล็อกเธรด และแสดงข้อความเสมอ os_log ทำงานแบบไม่พร้อมกัน เร็วกว่า 50 เท่าในสถานการณ์ที่มีโหลดสูง รองรับหมวดหมู่ และปิดเชิงอัตโนมัติระดับดีบักในบิลด์ Release โดยไม่สูญเสียประสิทธิภาพ

ทำไม Console ไม่แสดง os_log จากแอพ?

ตรวจสอบ ระดับการบันทึก: โดยค่าเริ่มต้น Console แสดงเฉพาะ default และสูงกว่า เพื่อดู info และ debug เปิดเมนู os_log ใน Console Xcode และเลือก Include Info Messages และ Include Debug Messages ในการตั้งค่าสญญา (Edit Scheme → Run → Arguments → OS_ACTIVITY_MODE = debug)

จะบันทึก Console ไว้ในไฟล์เพื่อแชร์ได้อย่างไร?

เลือก ข้อความที่ต้องการใน Console คัดลอก (Cmd + C) และวางในโปรแกรมแก้ไขข้อความใดๆ สำหรับการดังข้อมูลที่สมบูรณ์ ใช้คำสั่งเทอร์มินัล: sudo log collect --device --output /tmp/app_logs.logarchive — มันจะบันทึกบันทึกทั้งหมดจากอุปกรณ์ iOS ไว้ในรูปแบบที่มีโครงสร้าง

จะเปิดใช้งาน os_log ในบิลด์ Release ได้อย่างไร?

os_log ชนิด .default และ .error ทำงานใน Release โดยค่าเริ่มต้น สำหรับ .info และ .debug ใน Release คุณจำเป็นต้องเพิ่มอาร์กิวเมนต์เริ่มต้น -OSLogPreferencesApp “$(PRODUCT_BUNDLE_IDENTIFIER):debug” ในโครงสร้าง Xcode หากไม่มีอาร์กิวเมนต์นี้ ข้อความดีบักจะไม่ถูกรวบรวมใน Release ซึ่งประหยัดทรัพยากรของอุปกรณ์

จะค้นหาบันทึกข้อขัดองเฉพาะเจาะจงในประวัติได้อย่างไร?

เปิด Window → Organizer → Crashes ใน Xcode ตัวจัดระเบียบแสดงบันทึกข้อขัดองทั้งหมดที่รวบรวมจากอุปกรณ์ของผู้ทดสอบ โดยจัดกลุ่มตามชนิดข้อยกเว้น Symbolication ต้องใช้ไฟล์ .dSYM จากบิลด์ที่เกิดข้อขัดอง — Xcode จะค้นหาโดยอัตโนมัติหากมีไฟล์จัดเก็บ

สรุป

  • Console Xcode — เครื่องมือในตัวสำหรับดู NSLog, os_log, print และบันทึกข้อขัดองใน Debug Area
  • os_log — API ที่แนะนำพร้อมการเขียนแบบไม่พร้อมกัน หมวดหมู่ และการรองรับ Unified Logging System
  • Unified Logging ให้ระบบย่อยและหมวดหมู่สำหรับการจัดระเบียบบันทึกแบบโมดูล
  • บันทึกเบรกพอย์นต์ ส่งข้อความไปยัง Console โดยไม่หยุดการทำงานของแอพลิเคชัน
  • คำสั่ง LLDB po, p, expr ควบคุมรูปแบบผลลัพธ์คอนโซลได้อย่างสมบูรณ์
  • การวิเคราะห์บันทึกข้อขัดอง เริ่มต้นด้วยข้อยกเว้นใน Console และต้องใช้ symbolication ผ่าน dSYM สำหรับ Release
  • การผนวกานกับ Instruments ช่วยให้รวมบันทึกกับการทำโปรไฟล์บนไลน์เวลาเดียว

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม