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 = "Debug मोड"
label.textColor = .systemBlue
view.addSubview(label)
}
}
Xcode Organizer Crash Logs के माध्यम से परीक्षकों के डिवाइस से क्रैश लॉग एकत्र करता है। symbolication (पतों को फ़ंक्शन नामों में बदलना) के लिए .dSYM फ़ाइल की आवश्यकता होती है, जो प्रत्येक Debug बिल्ड के साथ उत्पन्न होती है। Release बिल्ड में भी dSYM बनाया जाता है, लेकिन App Store से क्रैश लॉग को Organizer में मैन्युअल रूप से या bitcode सेवा के माध्यम से अपलोड करना होता है।
अक्सर पूछे जाने वाले प्रश्न
तकनीकी रूप से हाँ — Debug प्रमाणपत्र के साथ Ad Hoc वितरण के माध्यम से, लेकिन Apple और Google ऐसा करने की अनुशंसा नहीं करते। Debug बिल्ड में डिबगिंग प्रतीक और कम प्रदर्शन होता है, जो UX को ख़राब करता है और ऐप्लिकेशन का आकार 2–3 गुना बढ़ा देता है।
कारण कंपाइलर ऑप्टिमाइज़ेशन का बंद होना है (-O0)। कंपाइलर फ़ंक्शन इनलाइन नहीं करता, मृत कोड नहीं हटाता और सभी मध्यवर्ती वेरिएबल बनाए रखता है। इसके अतिरिक्त, Debug में assertions और ऐरे सीमा जाँचें शामिल हैं जो 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 एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें