Xcode میں کنسول iOS ڈویلپمنٹ کے لیے ایک ڈیبگنگ ٹول ہے جو NSLog، print، os_log آؤٹ پٹ اور ایپ کریش لاگ کو ریئل ٹائم میں دکھاتا ہے۔ Apple Unified Logging کے مطابق، iOS 10 سے Apple Unified Logging System کے ذریعے مرکزی پیغام جمع کرنے کے لیے NSLog کے بجائے os_log استعمال کرنے کی تجویز کرتا ہے۔ کنسول ڈیبگر آؤٹ پٹ اور سسٹم پیغامات کو ایک واحد Debug Area ونڈو میں یکجا کرتا ہے، جو ڈویلپمنٹ کے کسی بھی لمحے قابل رسائی ہے۔
اہم نکات
کنسول Xcode میں Debug Area کا حصہ ہے، جو ایڈیٹر کے نیچے پینل میں واقع ہے (View → Debug Area → Activate Console، شارٹ کٹ Cmd + Shift + Y)۔ کنسول چلتی ہوئی ایپ سے تمام ٹیکسٹ آؤٹ پٹ دکھاتا ہے: NSLog، os_log، print سے پیغامات، رن ٹائم وارننگز اور ایپ کریش ہونے پر خودکار استثنا ڈمپ۔
کنسول سمیولیٹر اور فزیکل ڈیوائس دونوں پر کام کرتا ہے۔ سمیولیٹر میں، پیغامات مقامی پائپ کے ذریعے فوری طور پر پہنچتے ہیں؛ ڈیوائس پر، وہ USB کنکشن کے ذریعے 1–3 فریم کی تاخیر سے آتے ہیں۔ پروڈکشن ایپس کے لیے، ڈیوائس پر کنسول دستیاب نہیں ہے — ڈویلپرز Crashlytics یا log collect کے ذریعے دور دراز سے جمع کرنے کے ساتھ Unified Logging پر انحصار کرتے ہیں۔
Mac پر سسٹم Console.app کے برعکس، Xcode میں کنسول ونڈو صرف موجودہ چلتی ہوئی ایپ کے لاگ دکھاتی ہے (فلٹرنگ کی صلاحیت کے ساتھ)۔ Console.app iOS سمیولیٹر سمیت Mac پر تمام پروسیسز کے لاگ جمع کرتا ہے۔ تاہم، iOS ایپس کو ڈیبگ کرنے کے لیے، ڈویلپرز LLDB ڈیبگر کے ساتھ انضمام کی وجہ سے بلٹ ان Xcode کنسول استعمال کرتے ہیں۔
کنسول آؤٹ پٹ کے لیے iOS ڈویلپر کو تین اہم APIs دستیاب ہیں: NSLog (قدیم)، os_log (تجویز کردہ) اور print (صرف Swift)۔ ہر ایک کی کارکردگی، فارمیٹنگ اور Unified Logging System کے ساتھ مطابقت کے لحاظ سے اپنی خصوصیات ہیں۔
NSLog Foundation کا ایک فنکشن ہے، جو Objective-C اور Swift میں دستیاب ہے۔ NSLog ٹائم اسٹیمپ، پروسیس نام اور PID کے ساتھ پیغام آؤٹ پٹ کرتا ہے۔ نقصانات: NSLog سسٹم بفر میں ہم آہنگی سے لکھتا ہے، لکھنے کے دوران موجودہ تھریڈ کو بلاک کرتا ہے۔ بار بار کالز کے ساتھ (مثلاً، لوپ میں)، NSLog نمایاں تاخیر پیدا کرتا ہے۔ Apple نئے پروجیکٹس کے لیے NSLog کی سفارش نہیں کرتا، لیکن یہ پرانے کوڈ اور تیسرے فریق کی لائبریریوں کے ساتھ مطابقت رکھتا ہے۔
os_log os.framework کا ایک API ہے، جو iOS 10 میں متعارف کرایا گیا۔ os_log غیر متزامن ہے: پیغام قطار میں لگایا جاتا ہے اور کالنگ تھریڈ کو بلاک کیے بغیر بفر میں لکھا جاتا ہے۔ WWDC 2016 کے مطابق، زیادہ بوجھ والے منظرناموں میں os_log NSLog سے 50 گنا تیز ہے۔ os_log متحرک کنٹرول بھی سپورٹ کرتا ہے: DEBUG سطح کے پیغامات صرف Debug بلڈ میں جمع کیے جاتے ہیں، اور Release میں بغیر کسی اوور ہیڈ کے نظر انداز کر دیے جاتے ہیں۔
print() Swift میں سب سے آسان آؤٹ پٹ طریقہ ہے۔ print stdout (معیاری آؤٹ پٹ) میں لکھتا ہے، جسے Xcode کنسول میں ری ڈائریکٹ کرتا ہے۔ print میٹا ڈیٹا (وقت، سطح) شامل نہیں کرتا، لیکن stdout بفرنگ کو سپورٹ کرتا ہے۔ فوری ڈیبگنگ کے لیے، 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 تمام سسٹم پروسیسز سے پیغامات کو ایک اسٹوریج میں جمع کرتا ہے جس میں Mac پر log کمانڈ لائن ٹول کے ذریعے دور دراز تک رسائی کی صلاحیت ہے۔ ڈویلپر ULS میں لکھنے کے لیے os_log اور پڑھنے کے لیے کنسول استعمال کرتے ہیں۔
ہر OSLog کی شناخت subsystem (مثلاً com.myapp.network) اور category (مثلاً http، websocket) کے جوڑے سے ہوتی ہے۔ ذیلی نظام ایپلیکیشن ڈومین ہے (ایک ایپ کے مختلف ماڈیولز کے لیے متعدد ذیلی نظام ہو سکتے ہیں)۔ زمرہ ذیلی نظام کے اندر ایک جزو ہے۔ subsystem + category کا امتزاج کنسول اور log collect میں لچکدار لاگ فلٹرنگ کی اجازت دیتا ہے۔
| سطح | OSLogType | کنسول ڈسپلے | Release میں جمع |
|---|---|---|---|
| Default | .default | ہمیشہ | ہاں |
| Info | .info | os_log UI فعال ہونے پر | ہاں |
| Debug | .debug | صرف Debug بلڈ میں | نہیں |
| Error | .error | ہمیشہ سرخ لیبل کے ساتھ | ہاں |
| Fault | .fault | ہمیشہ جامنی لیبل کے ساتھ | ہاں |
Mac پر log collect کمانڈ منسلک iOS ڈیوائس سے محفوظ شدہ لاگ کو .logarchive فائل میں جمع کرتا ہے۔ اس فائل کو Mac پر Console.app میں کھول کر تفصیلی تجزیہ کیا جا سکتا ہے، جس میں os_log پیغامات، کریش لاگ اور سسٹم تشخیص شامل ہیں۔ ڈیوائس پر جمع کرنے کو فعال کرنے کے لیے، ڈیولپر موڈ کو فعال کرنا اور ڈیوائس کو USB کے ذریعے منسلک کرنا ضروری ہے۔
کنسول کے ساتھ عملی کام میں تین اہم منظرنامے شامل ہیں: ڈویلپمنٹ کے دوران فعال لاگنگ، کریش کے بعد کریش لاگ تجزیہ اور .logarchive کے ذریعے دور دراز تشخیص۔ ہر منظرنامے کے لیے ٹولز اور سیٹنگز کا ایک بہترین سیٹ ہے۔
ہر ایپلیکیشن ماڈیول کے لیے سطحوں کے ساتھ ایک علیحدہ OSLog بنانے کی سفارش کی جاتی ہے: debug (تفصیلی ڈیبگنگ)، info (اہم حالت کی منتقلی)، error (استثنا اور ناکامیاں)۔ Xcode کنسول میں، اپنی ایپلیکیشن کے سب سسٹم کے مطابق فلٹرنگ کو فعال کریں تاکہ سسٹم کے پیغامات کو خارج کیا جا سکے جو شور پیدا کرتے ہیں اور ایپ منطق سے توجہ ہٹاتے ہیں۔
جب ایپ کریش ہوتی ہے، Xcode خود بخود عملدرآمد روک دیتا ہے اور کنسول میں مکمل اسٹیک ٹریس کے ساتھ وہ تھریڈ دکھاتا ہے جہاں کریش ہوا۔ کریش لاگ کی پہلی لائن میں استثنا کی قسم (NSException، EXC_BAD_ACCESS) اور وجہ ہوتی ہے۔ اسٹیک ٹریس کو نیچے سے اوپر تک پڑھیں: آخری کال کیا گیا طریقہ کریش کا مقام ہے۔ خفیہ کردہ پتوں کے لیے (Release میں)، dSYM کے ذریعے symbolication ضروری ہے۔
// 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)
Xcode کنسول کئی اعلیٰ خصوصیات کو سپورٹ کرتا ہے جو سادہ لاگنگ سے آگے بڑھتی ہیں۔ بریک پوائنٹ لاگ آپ کو عملدرآمد روکے بغیر کنسول میں پیغام بھیجنے کی اجازت دیتے ہیں، اور Debugger Command میں LLDB کمانڈز آؤٹ پٹ فارمیٹنگ پر مکمل کنٹرول دیتے ہیں۔
آپ بریک پوائنٹ ترتیب دے سکتے ہیں تاکہ وہ کنسول میں پیغام بھیجے اور خود بخود عملدرآمد جاری رکھے۔ مطلوبہ لائن پر بریک پوائنٹ لگائیں، دایاں کلک کریں → Edit Breakpoint → Debugger Command شامل کریں: «po self» یا «expr @import UIKit» + Debugger Command: «po self.view»۔ Automatically continue after evaluating کو نشان زد کریں۔ شروع کرنے کے بعد، بریک پوائنٹ ہر بار لائن پر پہنچنے پر کمانڈ کا نتیجہ کنسول میں بھیجے گا، بغیر تھریڈ میں خلل ڈالے۔
Xcode کنسول بریک پوائنٹ پر رکتے ہوئے صوابدیدی LLDB کمانڈز کے عملدرآمد کو سپورٹ کرتا ہے۔ po (print object) کسی آبجیکٹ کی تفصیل آؤٹ پٹ کرتا ہے، p (print) ابتدائی اقدار آؤٹ پٹ کرتا ہے، اور expr Swift/ObjC اظہارات پر عملدرآمد کرتا ہے۔ فارمیٹ شدہ آؤٹ پٹ کے لیے، p/CGRectGetWidth استعمال کریں۔ LLDB آؤٹ پٹ بریک پوائنٹ تک پہنچنے کے فوراً بعد کنسول میں ظاہر ہوتا ہے۔
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)
}
Xcode کنسول Instruments — Xcode کے پروفائلنگ ٹول — کے ساتھ قریبی طور پر مربوط ہے۔ Product → Profile کے ذریعے Logging ٹیمپلیٹ کے ساتھ ایپ چلاتے وقت، تمام os_log پیغامات ٹائم اسٹیمپ کے ساتھ Instruments ٹریس میں ریکارڈ ہوتے ہیں۔ یہ آپ کو ایک ہی ٹائم لائن پر بیک وقت لاگ، کارکردگی اور سسٹم ایونٹس دیکھنے کی اجازت دیتا ہے، جو ریس کنڈیشنز اور کارکردگی میں کمی کی تشخیص کے لیے اہم ہے۔
اکثر پوچھے گئے سوالات
NSLog ہم آہنگ ہے، تھریڈ کو بلاک کرتا ہے اور ہمیشہ پیغام آؤٹ پٹ کرتا ہے۔ os_log غیر متزامن ہے، زیادہ بوجھ والے منظرناموں میں 50 گنا تیز ہے، زمروں کو سپورٹ کرتا ہے اور کارکردگی کے نقصان کے بغیر Release بلڈز میں ڈیبگ لیولز کو متحرک طور پر غیر فعال کرتا ہے۔
لاگنگ لیول چیک کریں: ڈیفالٹ کے طور پر، کنسول صرف default اور اوپر دکھاتا ہے۔ info اور debug دیکھنے کے لیے، Xcode کنسول میں os_log مینو کھولیں اور سکیم سیٹنگز میں Include Info Messages اور Include Debug Messages کو منتخب کریں (Edit Scheme → Run → Arguments → OS_ACTIVITY_MODE = debug)۔
کنسول میں مطلوبہ پیغامات کو منتخب کریں، کاپی کریں (Cmd + C) اور کسی بھی ٹیکسٹ ایڈیٹر میں پیسٹ کریں۔ مکمل ڈمپ کے لیے، ٹرمینل کمانڈ استعمال کریں: sudo log collect --device --output /tmp/app_logs.logarchive — یہ iOS ڈیوائس سے تمام لاگ کو ساختہ فارمیٹ میں محفوظ کرتا ہے۔
os_log قسم .default اور .error ڈیفالٹ کے طور پر Release میں کام کرتے ہیں۔ Release میں .info اور .debug کے لیے، آپ کو Xcode سکیم میں -OSLogPreferencesApp «$(PRODUCT_BUNDLE_IDENTIFIER):debug» لانچ آرگیومینٹ شامل کرنا ہوگا۔ اس آرگیومینٹ کے بغیر، ڈیبگ پیغامات Release میں جمع نہیں ہوتے، جس سے ڈیوائس کے وسائل بچتے ہیں۔
Xcode میں Window → Organizer → Crashes کو کھولیں۔ آرگنائزر استثنا کی قسم کے مطابق گروپ کردہ، ٹیسٹرز کے ڈیوائسز سے جمع کردہ تمام کریش لاگ دکھاتا ہے۔ Symbolication کے لیے اس بلڈ سے .dSYM فائل کی ضرورت ہے جس میں کریش ہوا — Xcode خود بخود اسے ڈھونڈ لیتا ہے اگر آرکائیو دستیاب ہو۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں