Debug (ڈیبگ موڈ) — موبائل ایپلیکیشن کی بلڈ کنفیگریشن ہے جس میں کمپائلر علامتی معلومات شامل کرتا ہے، کوڈ آپٹیمائزیشن غیر فعال کرتا ہے اور مرحلہ وار تجزیہ کے لیے ڈیبگر کو جوڑتا ہے۔ Android Developers کے مطابق، Debug بلڈ میں ڈیبگنگ علامات ہوتی ہیں، وسائل کو کمپریس نہیں کرتا اور ڈیٹابیس اور نیٹ ورک درخواست انسپکٹر کو جوڑنے کی اجازت دیتا ہے۔ Debug موڈ Release بلڈ کے مقابل ہے: Debug میں ڈیولپر کوڈ کی شفافیت کے لیے کارکردگی قربان کرتا ہے۔
اہم نکات
Debug صرف ایک کمپائلر فلیگ نہیں ہے بلکہ سیٹنگز کا ایک مکمل سیٹ ہے جو ایپلیکیشن کو ڈیولپر کے لیے شفاف بناتا ہے۔ Debug موڈ میں، کمپائلر ایگزیکیوٹیبل فائل میں علامتی ناموں کی ایک جدول (DWARF) شامل کرتا ہے، جو مشین کوڈ کو سورس لائنوں سے جوڑتی ہے۔ اس جدول کے بغیر، ڈیبگر یہ نہیں دکھا سکتا کہ اس وقت کوڈ کی کون سی لائن چل رہی ہے۔
ڈیبگر (debugger) ایک پروگرام ہے جو آپ کی ایپلیکیشن کو کنٹرول شدہ ماحول میں چلاتا ہے۔ آپ کسی بھی لائن پر عمل روک سکتے ہیں (بریک پوائنٹ)، موجودہ دائرہ کار میں تمام متغیرات کی قدریں دیکھ سکتے ہیں، انہیں چلتے چلتے تبدیل کر سکتے ہیں اور عمل جاری رکھ سکتے ہیں۔ موبائل پلیٹ فارمز کے لیے معیاری ڈیبگر LLDB ہے — Xcode اور Android Studio دونوں میں استعمال ہونے والا LLVM جز۔
Debug موڈ میں اضافی جانچیں بھی شامل ہیں جو Release میں غیر فعال ہوتی ہیں: دعوے (assertions)، صفوں کی حدوں کی جانچ، میموری لیک ڈیٹیکٹر اور وسیع لاگنگ۔ یہ جانچیں ایپلیکیشن کو سست کرتی ہیں لیکن ڈیولپمنٹ کے ابتدائی مراحل میں غلطیاں پکڑتی ہیں — کوڈ صارف تک پہنچنے سے پہلے۔
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 = "ڈیبگ موڈ"
label.textColor = .systemBlue
view.addSubview(label)
}
}
Xcode Organizer Crash Logs کے ذریعے ٹیسٹرز کے ڈیوائسز سے کریش لاگز جمع کرتا ہے۔ 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں