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 থেকে বার্তা, রানটাইম সতর্কতা এবং অ্যাপ ক্র্যাশ হলে স্বয়ংক্রিয় এক্সেপশন ডাম্প।
কনসোল কাজ করে সিমুলেটর এবং ফিজিক্যাল ডিভাইস উভয়েই। সিমুলেটরে, বার্তাগুলি স্থানীয় পাইপের মাধ্যমে তাৎক্ষণিকভাবে পৌঁছে; ডিভাইসে, তারা 1–3 ফ্রেম বিলম্বে USB সংযোগের মাধ্যমে আসে। প্রোডাকশন অ্যাপের জন্য, ডিভাইসে কনসোল উপলব্ধ নয় — ডেভেলপাররা Crashlytics বা log collect-এর মাধ্যমে দূরবর্তী সংগ্রহ সহ Unified Logging-এর উপর নির্ভর করে।
Mac-এ সিস্টেম Console.app-এর থেকে ভিন্ন, Xcode-এ কনসোল উইন্ডো শুধুমাত্র বর্তমান চলমান অ্যাপের লগ দেখায় (ফিল্টারিং ক্ষমতা সহ)। Console.app Mac-এ সমস্ত প্রক্রিয়ার লগ সংগ্রহ করে, iOS সিমুলেটর সহ। তবে, iOS অ্যাপ ডিবাগ করার জন্য, ডেভেলপাররা LLDB ডিবাগারের সাথে একীকরণের কারণে অন্তর্নির্মিত Xcode কনসোল ব্যবহার করে।
তিনটি প্রধান API iOS ডেভেলপারের জন্য কনসোল আউটপুটের জন্য উপলব্ধ: 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 | সর্বদা বেগুনি লেবেল সহ | হ্যাঁ |
log collect কমান্ড Mac-এ সংযুক্ত iOS ডিভাইস থেকে সংরক্ষিত লগ .logarchive ফাইলে সংগ্রহ করে। এই ফাইলটি Mac-এ Console.app-এ বিস্তারিত বিশ্লেষণের জন্য খোলা যেতে পারে, যার মধ্যে os_log বার্তা, ক্র্যাশ লগ এবং সিস্টেম ডায়াগনস্টিক অন্তর্ভুক্ত। ডিভাইসে সংগ্রহ সক্রিয় করতে, ডেভেলপার মোড সক্রিয় করা এবং USB-এর মাধ্যমে ডিভাইস সংযোগ করা প্রয়োজন।
ব্যবহারিক কাজ কনসোলের সাথে তিনটি প্রধান পরিস্থিতি অন্তর্ভুক্ত করে: ডেভেলপমেন্টের সময় সক্রিয় লগিং, ক্র্যাশের পরে ক্র্যাশ লগ বিশ্লেষণ এবং .logarchive-এর মাধ্যমে দূরবর্তী ডায়াগনস্টিকস। প্রতিটি পরিস্থিতির জন্য সরঞ্জাম এবং সেটিংসের একটি সর্বোত্তম সেট রয়েছে।
সুপারিশ করা হয় যে প্রতিটি অ্যাপ্লিকেশন মডিউলের জন্য স্তর সহ একটি পৃথক OSLog তৈরি করুন: debug (বিস্তারিত ডিবাগিং), info (মূল অবস্থা পরিবর্তন), error (এক্সেপশন এবং ব্যর্থতা)। Xcode কনসোলে, আপনার অ্যাপ্লিকেশনের সাবসিস্টেম দ্বারা ফিল্টারিং সক্রিয় করুন যাতে সিস্টেম বার্তাগুলি বাদ দেওয়া যায় যা শব্দ সৃষ্টি করে এবং অ্যাপ লজিক থেকে বিভ্রান্ত করে।
যখন অ্যাপ ক্র্যাশ হয়, Xcode স্বয়ংক্রিয়ভাবে এক্সিকিউশন বন্ধ করে এবং কনসোলে সম্পূর্ণ stack trace সহ ক্র্যাশ হওয়া থ্রেড দেখায়। ক্র্যাশ লগের প্রথম লাইনে এক্সেপশনের ধরন (NSException, EXC_BAD_ACCESS) এবং কারণ থাকে। Stack trace নিচ থেকে উপরে পড়ুন: শেষ কল করা পদ্ধতিটি ক্র্যাশের অবস্থান। এনক্রিপ্ট করা ঠিকানার জন্য (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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন