Debug (ডিবাগ মোড) — এটি মোবাইল অ্যাপ্লিকেশনের একটি বিল্ড কনফিগারেশন যেখানে কম্পাইলার সিম্বলিক তথ্য অন্তর্ভুক্ত করে, কোড অপ্টিমাইজেশন বন্ধ করে এবং ধাপে ধাপে এক্সিকিউশন বিশ্লেষণের জন্য ডিবাগার সংযুক্ত করে। Android Developers-এর মতে, Debug বিল্ডে ডিবাগিং সিম্বল থাকে, রিসোর্স কম্প্রেস করে না এবং ডেটাবেস ও নেটওয়ার্ক রিকোয়েস্ট ইন্সপেক্টর সংযুক্ত করার অনুমতি দেয়। Debug মোড Release বিল্ডের বিপরীত: Debug-এ ডেভেলপার কোড এক্সিকিউশনের স্বচ্ছতার জন্য পারফরম্যান্স বিসর্জন দেয়।
মূল পয়েন্ট
Debug শুধু একটি কম্পাইলার ফ্ল্যাগ নয়, বরং সেটিংসের একটি সম্পূর্ণ সেট যা অ্যাপ্লিকেশনকে ডেভেলপারের জন্য স্বচ্ছ করে তোলে। Debug মোডে, কম্পাইলার এক্সিকিউটেবল ফাইলে একটি সিম্বল নেম টেবিল (DWARF) যোগ করে, যা মেশিন কোডকে সোর্স লাইনের সাথে সংযুক্ত করে। এই টেবিল ছাড়া, ডিবাগার দেখাতে পারে না যে এই মুহূর্তে কোডের কোন লাইন এক্সিকিউট হচ্ছে।
ডিবাগার (debugger) একটি প্রোগ্রাম যা আপনার অ্যাপ্লিকেশনকে নিয়ন্ত্রিত পরিবেশে চালায়। আপনি যেকোনো লাইনে এক্সিকিউশন থামাতে পারেন (ব্রেকপয়েন্ট), বর্তমান স্কোপের সব ভেরিয়েবলের মান দেখতে পারেন, সেগুলো চলাকালীন পরিবর্তন করতে পারেন এবং এক্সিকিউশন চালিয়ে যেতে পারেন। মোবাইল প্ল্যাটফর্মের জন্য স্ট্যান্ডার্ড ডিবাগার হল LLDB — একটি LLVM কম্পোনেন্ট যা Xcode এবং Android Studio উভয়েই ব্যবহৃত হয়।
Debug মোডে অতিরিক্ত চেকও অন্তর্ভুক্ত যা Release-এ বন্ধ থাকে: অ্যাসারশন, অ্যারে বাউন্ডস চেক, মেমরি লিক ডিটেক্টর এবং বিস্তৃত লগিং। এই চেকগুলি অ্যাপ্লিকেশনকে ধীর করে কিন্তু উন্নয়নের প্রাথমিক পর্যায়ে ত্রুটি ধরে — কোড ব্যবহারকারীর কাছে পৌঁছানোর আগে।
Debug এবং Release বিল্ডের মধ্যে পার্থক্য মৌলিক: এগুলি কম্পাইলার ফ্ল্যাগ, সই কনফিগারেশন এবং প্যাকেজিং সেটিংসের দুটি ভিন্ন সেট। এই পার্থক্যগুলি বোঝা “সিমুলেটরে কাজ করে কিন্তু বাস্তব ডিভাইসে না” এমন পরিস্থিতি এড়াতে সাহায্য করে।
| প্যারামিটার | Debug | Release |
|---|---|---|
| অপ্টিমাইজেশন | বন্ধ (-O0) | চালু (-Os বা -O2) |
| সিম্বল | সম্পূর্ণ DWARF টেবিল | মুছে ফেলা হয়েছে |
| সই | ডেভেলপমেন্ট সার্টিফিকেট | ডিস্ট্রিবিউশন সার্টিফিকেট |
| প্রোফাইল | Debug প্রোভিশনিং প্রোফাইল | App Store / Ad Hoc প্রোফাইল |
| লগিং | সম্পূর্ণ (সব লেভেল) | বন্ধ বা ন্যূনতম |
| অবফাসকেশন | বন্ধ | চালু (ProGuard/R8) |
| .apk/.ipa আকার | বড় (সিম্বল + কম্প্রেশন ছাড়া) | ছোট (R8 + রিসোর্স) |
Debug বিল্ড ডেভেলপমেন্ট এবং লোকাল ডিভাইসে পরীক্ষার সব ধাপে ব্যবহৃত হয়। Release বিল্ড App Store Connect বা Google Play Console-এ পাঠানোর আগে তৈরি করা হয়। Release বিল্ডে ডিবাগিং প্রযুক্তিগতভাবে সম্ভব কিন্তু নাম পরিবর্তিত মেথড (R8) এবং ক্র্যাশ লগের জন্য symbolication-এর অভাবে অত্যন্ত অসুবিধাজনক।
একটি সাধারণ সমস্যা হল কোড যা Debug-এ কাজ করে কিন্তু Release-এ ক্র্যাশ করে। কারণ হল কোডে UB (অনির্ধারিত আচরণ) যা কম্পাইলার বিভিন্ন অপ্টিমাইজেশন লেভেলে ভিন্নভাবে হ্যান্ডল করে। একটি সাধারণ উদাহরণ: আরম্ভ না করা ভেরিয়েবল পড়া বা strict aliasing লঙ্ঘন। এই ধরনের ত্রুটি সনাক্ত করতে, প্রতিটি Release বিল্ডের আগে একটি স্ট্যাটিক অ্যানালাইজার (Clang Static Analyzer, ktlint) ব্যবহার করুন।
LLDB হল LLVM-ভিত্তিক একটি উচ্চ-পারফরম্যান্স ডিবাগার যা C, C++, Objective-C, Swift এবং Kotlin/Native সমর্থন করে। LLDB একটি REPL ইন্টারফেস প্রদান করে যেখানে আপনি ইচ্ছামত এক্সপ্রেশন এক্সিকিউট করতে পারেন, ভেরিয়েবল মান পরিবর্তন করতে পারেন এবং থামানো অ্যাপ্লিকেশনের প্রসঙ্গে ফাংশন কল করতে পারেন।
ব্রেকপয়েন্ট ডিবাগারের একটি মূল টুল। আপনি কোডের একটি লাইনে একটি পয়েন্ট সেট করেন, এবং এক্সিকিউশন যখন সেই লাইনে পৌঁছায় তখন অ্যাপ্লিকেশন থামে। LLDB বিভিন্ন ধরনের ব্রেকপয়েন্ট সমর্থন করে: শর্তসাপেক্ষ (শুধুমাত্র শর্ত পূরণ হলে সক্রিয়), সিম্বলিক (ফাংশন কল-এ) এবং ওয়ান-শট (একবার সক্রিয় হয়ে স্বয়ংক্রিয়ভাবে মুছে যায়)।
ওয়াচপয়েন্ট হল ভেরিয়েবল পরিবর্তন পর্যবেক্ষণের একটি পয়েন্ট। আপনি একটি মেমরি ঠিকানা নির্দিষ্ট করেন, এবং ডিবাগার সেই ঠিকানায় যেকোনো লেখায় এক্সিকিউশন থামায়। এই টুল ডেটা রেস এবং শেয়ার্ড অবজেক্টের ভুল মিউটেশন খুঁজতে অপরিহার্য। UIKit হায়ারার্কি দেখতে, Xcode-এ উপলব্ধ UIView Inspector ব্যবহার করুন।
// শর্তসাপেক্ষ ব্রেকপয়েন্ট সেট করা
(lldb) breakpoint set --name "viewDidLoad" --condition "self.isViewLoaded == false"
// প্রপার্টিতে ওয়াচপয়েন্ট
(lldb) watchpoint set variable self->_loadingState
// থামানো কনটেক্সটে কোড এক্সিকিউট করা
(lldb) expr self.view.backgroundColor = UIColor.redColor
উভয় IDE, LLDB-এর উপরে গ্রাফিক্যাল ইন্সপেক্টর প্রদান করে। Android Studio-তে Layout Inspector (View হায়ারার্কি), Network Inspector (HTTP রিকোয়েস্ট ট্রেসিং) এবং Database Inspector (রিয়েল-টাইম SQLite) অন্তর্ভুক্ত। Xcode Debug Memory Graph (মেমরি লিক বিশ্লেষণ) এবং View Debugger (UIKit লেয়ারের 3D ভিউ) প্রদান করে।
Android 11 থেকে শুরু করে, Wi-Fi-তে ডিবাগিং USB সংযোগ ছাড়াই কাজ করে: শুধু Android Studio থেকে QR কোড স্ক্যান করুন। iOS Xcode 9+ থেকে Wi-Fi ডিবাগিং সমর্থন করে — ডিভাইস একবার USB-তে সংযুক্ত হয়, তারপর ডিবাগ সেশন নেটওয়ার্কে চলতে পারে। Wi-Fi ডিবাগিং অপ্রত্যাশিত লেটেন্সি এবং প্যাকেট লসের কারণে CI সার্ভারের জন্য উপযুক্ত নয়, তাই অটোমেটেড পাইপলাইন সবসময় USB ব্যবহার করে। তবে, লোকাল ডেভেলপমেন্টের জন্য, Wi-Fi ডিবাগিং উল্লেখযোগ্যভাবে আরও সুবিধাজনক — ডেভেলপার তারের সাথে বাঁধা থাকে না এবং রুমের অপর প্রান্তে থাকা ডিভাইসে অ্যাপ পরীক্ষা করতে পারে।
Android Debug Bridge (ADB) কমান্ড লাইন থেকে Android ডিভাইসের সাথে যোগাযোগের একটি সার্বজনীন টুল। ADB-এর মাধ্যমে আপনি অ্যাপ্লিকেশন ইনস্টল করতে পারেন, ডিবাগিং শুরু করতে পারেন, ফাইল কপি করতে পারেন, shell কমান্ড এক্সিকিউট করতে পারেন এবং লগ দেখতে পারেন। Android Studio সব ডিবাগিং অপারেশনের জন্য ADB ব্যবহার করে।
Android Studio দুটি ডিবাগিং মোড সমর্থন করে: Run (সাধারণ লঞ্চ) এবং Debug (ডিবাগার সংযুক্ত করে লঞ্চ)। Debug মোডে আপনি সরাসরি এডিটরে ব্রেকপয়েন্ট সেট করতে পারেন, Debug Tool Window-এ ভেরিয়েবল দেখতে পারেন এবং Evaluate Expression-এ এক্সপ্রেশন মূল্যায়ন করতে পারেন। ব্যাকগ্রাউন্ড প্রসেস (Service, BroadcastReceiver) ডিবাগ করতে, Attach Debugger to Android Process ব্যবহার করুন।
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// এখানে ব্রেকপয়েন্ট এক্সিকিউশন থামাবে
val button = findViewById<Button>(R.id.btn_debug)
button.setOnClickListener {
startDebugProcess()
}
}
private fun startDebugProcess() {
val data = fetchDataFromApi()
Log.d("Debug", "Data loaded: $data")
}
}
ADB shell কমান্ড রুট অধিকার ছাড়াই ডিভাইস ফাইল সিস্টেমে অ্যাক্সেস দেয়। আপনি databases ডিরেক্টরির বিষয়বস্তু দেখতে পারেন, .db ফাইল আপনার কম্পিউটারে কপি করতে পারেন এবং যেকোনো SQLite ক্লায়েন্ট দিয়ে খুলতে পারেন। Android Studio Database Inspector এই প্রক্রিয়াটি অটোমেট করে: আপনি রিয়েল টাইমে লাইভ ডেটাবেস ডেটা দেখতে পান এবং সরাসরি IDE থেকে SQL কোয়েরি এক্সিকিউট করতে পারেন।
Xcode LLDB-ভিত্তিক একটি সমন্বিত ডিবাগিং পরিবেশ প্রদান করে। ডেভেলপার সিমুলেটর বা ফিজিক্যাল ডিভাইসে অ্যাপ্লিকেশন চালাতে পারেন, ব্রেকপয়েন্ট সেট করতে পারেন এবং এক্সিকিউশন থ্রেড নিয়ন্ত্রণ করতে Debug Navigator ব্যবহার করতে পারেন। Android-এর বিপরীতে, iOS বিশেষ কনফিগারেশন ছাড়া একই ডিভাইসে একসঙ্গে দুটি Debug বিল্ড চালানোর অনুমতি দেয় না।
সিমুলেটর অ্যাপ্লিকেশনকে একটি নেটিভ macOS প্রসেস হিসেবে চালায়, যা দ্রুততম ডিবাগিং চক্র প্রদান করে। ফিজিক্যাল ডিভাইসে, ডিবাগিং USB বা Wi-Fi (iOS 16 থেকে শুরু) মাধ্যমে হয় এবং LLDB ডিভাইসে debugserver-এর সাথে যোগাযোগ করে। সীমিত USB 2.0 ব্যান্ডউইথের কারণে ডিভাইসে ডিবাগিং পারফরম্যান্স কম, কিন্তু শুধুমাত্র ফিজিক্যাল ডিভাইস বাস্তব পরিস্থিতি পরীক্ষা করতে দেয়: পুশ নোটিফিকেশন, ক্যামেরা, সেন্সর।
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
}
private func setupUI() {
let label = UILabel()
label.text = "Debug মোড"
label.textColor = .systemBlue
view.addSubview(label)
}
}
Xcode Organizer ক্র্যাশ লগের মাধ্যমে টেস্টারদের ডিভাইস থেকে ক্র্যাশ লগ সংগ্রহ করে। symbolication (ঠিকানাকে ফাংশন নামে রূপান্তর) করার জন্য .dSYM ফাইল প্রয়োজন, যা প্রতিটি Debug বিল্ডের সাথে তৈরি হয়। Release বিল্ডেও dSYM তৈরি হয়, কিন্তু App Store থেকে ক্র্যাশ লগ ম্যানুয়ালি বা bitcode সার্ভিসের মাধ্যমে Organizer-এ আপলোড করতে হয়।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
প্রযুক্তিগতভাবে হ্যাঁ — Debug সার্টিফিকেট সহ Ad Hoc ডিস্ট্রিবিউশনের মাধ্যমে, কিন্তু Apple এবং Google এটি করার পরামর্শ দেয় না। Debug বিল্ডে ডিবাগিং সিম্বল এবং কম পারফরম্যান্স থাকে, যা UX খারাপ করে এবং অ্যাপ্লিকেশনের আকার 2–3 গুণ বাড়িয়ে দেয়।
কারণ কম্পাইলার অপ্টিমাইজেশন বন্ধ থাকা (-O0)। কম্পাইলার ফাংশন ইনলাইন করে না, মৃত কোড সরায় না এবং সব মধ্যবর্তী ভেরিয়েবল ধরে রাখে। অতিরিক্তভাবে, Debug-এ অ্যাসারশন এবং অ্যারে বাউন্ডস চেক অন্তর্ভুক্ত যা Release-এ অনুপস্থিত।
Xcode-এ Window → Devices and Simulators বেছে নিন, আপনার ডিভাইসের জন্য “Connect via network” চেক করুন। ডিভাইস এবং Mac একই Wi-Fi নেটওয়ার্কে থাকতে হবে। একবার USB-তে সংযুক্ত করার পর, পরবর্তী লঞ্চে ডিবাগিং Wi-Fi-তে কাজ করবে।
Attach to process আপনাকে অ্যাপ্লিকেশন পুনরায় চালু না করেই ইতিমধ্যে চলমান প্রক্রিয়ায় ডিবাগার সংযুক্ত করতে দেয়। এটি Service, BroadcastReceiver বা সিস্টেম ইভেন্ট দ্বারা শুরু হওয়া প্রক্রিয়াগুলি ডিবাগ করার জন্য দরকারী, যেখানে স্ট্যান্ডার্ড Debug Run প্রযোজ্য নয়।
NSLog এবং print ডিফল্টরূপে শুধুমাত্র Debug কনফিগারেশনে লগ আউটপুট করে। Release-এর জন্য, OSLogType.default ফ্ল্যাগ সহ os_log ব্যবহার করুন — এটি Unified Logging System-এ বার্তা সংরক্ষণ করে এবং Mac-এ Console.app-এর মাধ্যমে অ্যাক্সেসযোগ্য।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন