بریک پوائنٹ (breakpoint) کوڈ میں ایک خاص نشان ہے، جس پر پہنچنے پر ڈیبگر حالت کا معائنہ کرنے کے لیے پروگرام کی عملدرآمد روک دیتا ہے۔ Apple Debugging Guide کے مطابق، breakpoints ڈویلپر کو سورس کوڈ میں ترمیم کیے بغیر متغیرات کی قدریں، کال اسٹیک دیکھنے اور مرحلہ وار عملدرآمد کرنے کی اجازت دیتے ہیں۔ یہ حقیقی وقت میں خرابیوں کی تشخیص اور ایپلیکیشن کے رویے کے تجزیہ کا بنیادی آلہ ہے۔
اہم نکات
Breakpoint ایک فعال نشان ہے جو سورس کوڈ کی مخصوص لائن پر لگایا جاتا ہے، جس پر پہنچنے پر ڈیبگر زبردستی تھریڈ کی عملدرآمد روک دیتا ہے۔ اس لمحے، ڈویلپر کو ایپلیکیشن کی حالت پر مکمل کنٹرول مل جاتا ہے: موجودہ دائرہ کار میں تمام متغیرات کی قدریں دیکھ سکتا ہے، کال اسٹیک کا معائنہ کر سکتا ہے، صوابدیدی اظہارات انجام دے سکتا ہے اور مرحلہ وار عملدرآمد جاری رکھ سکتا ہے۔ Breakpoints کے بغیر، ڈیبگنگ عارضی print اظہارات کو لامتناہی طور پر شامل کرنے اور پھر حذف کرنے تک محدود ہو جاتی — ایک طریقہ جو کوڈ کو آلودہ کرتا ہے اور انٹرایکٹو کنٹرول فراہم نہیں کرتا۔
Breakpoint کا بنیادی مقصد خرابی کے ماخذ کا پتہ لگانا ہے۔ جب کوئی ایپلیکیشن غیر متوقع رویہ دکھاتی ہے، ڈویلپر مشکوک حصے سے پہلے ایک بریک پوائنٹ رکھتا ہے اور ترتیب وار تجزیہ کرتا ہے کہ کون سا ڈیٹا آتا ہے، متغیرات کیسے بدلتے ہیں اور عملدرآمد کس راستے پر چلتا ہے۔ Apple کے مطابق، موبائل ایپس میں 70% سے زیادہ خرابیاں جامد کوڈ تجزیہ کے بجائے breakpoints اور مرحلہ وار عملدرآمد کے امتزاج سے درست طور پر شناخت کی جاتی ہیں۔
Breakpoints ریلیز بلڈ کی کارکردگی کو متاثر نہیں کرتے — یہ صرف Debug کنفیگریشن میں مرتب ہوتے ہیں۔ Xcode میں ایک خاص DEBUG پرچم ہے جو ڈیبگ کوڈ کو پری پروسیسر ہدایات سے گھیرتا ہے۔ اس سے یقینی ہوتا ہے کہ breakpoints App Store میں نہیں جاتے اور آخری صارفین کو سست نہیں کرتے۔
جب پروسیسر بریک پوائنٹ سے نشان زد لائن تک پہنچتا ہے، تو ایک ہارڈویئر یا سافٹ ویئر انٹرپٹ ہوتا ہے۔ Xcode میں SIGTRAP طریقہ کار استعمال ہوتا ہے — ایک ٹریس سگنل جو ڈیبگر کے ذریعے روکا جاتا ہے۔ LLDB تمام تھریڈز کو معطل کرتا ہے، Xcode انٹرفیس کو کنٹرول دیتا ہے اور ڈویلپر کے کمانڈ کا انتظار کرتا ہے: جاری رکھیں (continue)، آگے بڑھیں (step over)، اندر جائیں (step into) یا باہر آئیں (step out)۔
func fetchUserData(userId: Int) {
// LLDB will stop here if breakpoint is set
let url = URL(string: "https://api.example.com/user/\(userId)")
var request = URLRequest(url: url)
request.httpMethod = "GET"
print("Fetching user \(userId)")
}
اوپر کی مثال میں، لائن let url = ... پر لگایا گیا بریک پوائنٹ یہ جانچنے کی اجازت دیتا ہے کہ فنکشن میں کون سا userId بھیجا گیا، کیا URL درست طریقے سے جمع کیا گیا اور نیٹ ورک کال انجام دینے سے پہلے درخواست میں کون سے ہیڈر سیٹ ہیں۔
Xcode پانچ اہم اقسام کے breakpoints فراہم کرتا ہے، ہر ایک مخصوص ڈیبگنگ کام حل کرتا ہے۔ ان کے فرق کو سمجھنا ہر صورت حال کے لیے بہترین آلہ منتخب کرنے اور صرف لائن بریک پوائنٹ استعمال کرنے کے مقابلے میں تشخیص کا وقت 2-3 گنا کم کرنے کی اجازت دیتا ہے۔
| Breakpoint کی قسم | مقصد | فعالیت |
|---|---|---|
| Line breakpoint | کوڈ کی مخصوص لائن پر رکنا | ایڈیٹر میں لائن نمبر پر کلک کریں |
| Conditional breakpoint | شرط پوری ہونے پر رکنا | دایاں کلک → Edit Breakpoint → Condition |
| Symbolic breakpoint | فنکشن/طریقہ کال ہونے پر رکنا | Breakpoint Navigator → + → Symbolic Breakpoint |
| Exception breakpoint | استثنا پھینکے جانے پر رکنا | Breakpoint Navigator → + → Exception Breakpoint |
| Error breakpoint | خرابی ہونے پر رکنا (Swift) | Breakpoint Navigator → + → Swift Error Breakpoint |
Line breakpoint سب سے عام قسم ہے۔ یہ Xcode ایڈیٹر میں لائن نمبر پر ایک کلک سے لگایا جاتا ہے۔ جب اس لائن پر پہنچا جاتا ہے، عملدرآمد روک دیا جاتا ہے اور ڈویلپر Debug Area پینل یا LLDB کنسول کے ذریعے حالت کا معائنہ کر سکتا ہے۔ Stack Overflow کے اعدادوشمار کے مطابق، 85% سے زیادہ iOS ڈویلپر لائن breakpoints کو اپنے بنیادی ڈیبگنگ آلے کے طور پر استعمال کرتے ہیں، جبکہ دیگر اقسام مخصوص منظرناموں جیسے تیسرے فریق کی لائبریریاں ڈیبگ کرنے یا استثنا پکڑنے کے لیے استعمال ہوتی ہیں۔
Symbolic breakpoint آپ کو کسی مخصوص طریقہ یا فنکشن کے کال ہونے پر رکنے کی اجازت دیتا ہے، چاہے آپ کے پاس اس طریقہ کے سورس کوڈ تک رسائی نہ ہو۔ سسٹم فریم ورک کو ڈیبگ کرتے وقت یہ انمول ہے — مثال کے طور پر، جب UIKit layoutSubviews کو کال کرتا ہے اس لمحے کو روکنے کے لیے۔ ترتیب میں علامت کا نام (مثلاً، Objective-C کے لیے -[UIView layoutSubviews] یا Swift کے لیے UIView.layoutSubviews()) اور اختیاری پیرامیٹرز شامل ہیں: ماڈیول، شرط اور نظر انداز تعداد۔
// Symbolic breakpoint to intercept layoutSubviews on UITableView
// Symbol name: -[UITableView layoutSubviews]
// Action: po UITableView.appearance()
class CustomTableView: UITableView {
override func layoutSubviews() {
super.layoutSubviews()
// Symbolic breakpoint here will intercept the call
print("layoutSubviews called")
}
}
مشروط breakpoint لائن کے ہر عملدرآمد پر نہیں، بلکہ صرف اس وقت متحرک ہوتا ہے جب مخصوص منطقی اظہار true کا اندازہ لگائے۔ یہ لوپس، صفوں کی پروسیسنگ اور تکراری کالز کو ڈیبگ کرتے وقت بہت زیادہ وقت بچاتا ہے — ہر بار دستی طور پر Continue دبانے کے بجائے، ڈویلپر ایک شرط مقرر کرتا ہے اور ڈیبگر صرف متعلقہ لمحے پر رکتا ہے۔
شرط شامل کرنے کے لیے، بریک پوائنٹ پر دایاں کلک کریں، Edit Breakpoint منتخب کریں اور Condition فیلڈ میں Swift یا Objective-C میں ایک اظہار درج کریں۔ موازنہ، منطقی آپریٹرز اور بغیر ضمنی اثرات کے طریقہ کالز کی اجازت ہے۔ Xcode روکے گئے پروگرام کے سیاق و سباق میں اظہار کا اندازہ لگاتا ہے، اور اگر یہ درست ہے تو ڈیبگر حالت کو کیپچر کرتا ہے۔
for index in 0..<1000 {
// Breakpoint with condition: index == 500
// The debugger will stop only on the 501st iteration
processItem(at: index)
}
شرط کے علاوہ، ایک breakpoint پروگرام کو روکے بغیر خودکار ایکشنز انجام دے سکتا ہے۔ یہ بریک پوائنٹ کی ترتیبات میں Automatically continue after evaluating آپشن کے ذریعے لاگو کیا جاتا ہے۔ ایکشنز میں شامل ہیں: کنسول میں قدر آؤٹ پٹ کرنا (po variable)، آواز کا سگنل بجانا، صوابدیدی LLDB کمانڈ انجام دینا یا شیل اسکرپٹ چلانا۔ یہ طریقہ عارضی print اظہارات کی جگہ لیتا ہے اور سورس کوڈ میں ترمیم کیے بغیر ڈیٹا لاگ کرنے کی اجازت دیتا ہے۔
// Breakpoint with action: po «Index: \(index), value: \(items[index])»
// Automatically continue = true → program does not stop
func processItems(_ items: [String]) {
for (index, item) in items.enumerated() {
// Here the breakpoint logs every iteration without stopping
print("Processing \(item)")
}
}
یہ تکنیک خاص طور پر UI اپ ڈیٹس کو ڈیبگ کرتے وقت مفید ہے — مثال کے طور پر، کنٹرولر کوڈ میں مداخلت کیے بغیر تمام فریم تبدیلیاں لاگ کرنے کے لیے۔ Ray Wenderlich کے مطابق، عارضی print اظہار کے بجائے breakpoint ایکشنز استعمال کرنے سے بعد میں کوڈ صاف کرنے کی ضرورت نہ ہونے کی وجہ سے ڈیبگنگ کا وقت 30-40% کم ہو جاتا ہے۔
اگرچہ Xcode ایک آسان گرافیکل انٹرفیس فراہم کرتا ہے، LLDB ڈیبگر کنسول سے براہ راست بریک پوائنٹس کے پروگرامیٹک نظم کے لیے درجنوں کمانڈز کو سپورٹ کرتا ہے۔ یہ GUI کے ذریعے دستیاب نہ ہونے والی صلاحیتیں فراہم کرتا ہے: ریگولر ایکسپریشن کے ذریعے بریک پوائنٹس کی اجتماعی غیر فعالی، متحرک طور پر لوڈ کردہ لائبریریوں میں بریک پوائنٹ لگانا اور پیچیدہ کثیر مرحلہ ٹرگرز بنانا۔
| LLDB کمانڈ | وضاحت | مثال |
|---|---|---|
| breakpoint set | بریک پوائنٹ لگائیں | breakpoint set -f ViewController.swift -l 42 |
| breakpoint list | تمام breakpoints دکھائیں | breakpoint list |
| breakpoint disable | نمبر کے ذریعے بریک پوائنٹ غیر فعال کریں | breakpoint disable 1 |
| breakpoint delete | بریک پوائنٹ حذف کریں | breakpoint delete 1.2 |
| breakpoint modify | شرط یا ایکشن تبدیل کریں | breakpoint modify -c «i > 100» 1 |
(lldb) breakpoint set -f LoginViewController.swift -l 15 -c "email.isEmpty"
Breakpoint 1: 15 locations added.
(lldb) breakpoint modify 1 -C "po email" -G true
(lldb) breakpoint list
1: name = 'LoginViewController.swift:15', condition = 'email.isEmpty'
1.1: addr = 0x1000a3b40
LLDB فنکشن ناموں کے لیے ریگولر ایکسپریشن کے ذریعے بریک پوائنٹ لگانے کو سپورٹ کرتا ہے۔ یہ ایک پیٹرن سے ملنے والے تمام طریقوں کو روکنے کی اجازت دیتا ہے — مثال کے طور پر، کسی مخصوص کلاس میں handle سے شروع ہونے والے تمام طریقے۔ یہ طریقہ ری فیکٹرنگ کے دوران اور نامانوس کوڈ کے تجزیہ میں استعمال ہوتا ہے جب آپ کو یہ سمجھنے کی ضرورت ہوتی ہے کہ کسی خاص واقعہ کی پروسیسنگ میں کون سے طریقے شامل ہیں۔
(lldb) breakpoint set -r "handle[A-Z]" -s DataManager
Breakpoint 2: 6 locations.
(lldb) breakpoint set -r ".*Error.*"
Breakpoint 3: 23 locations.
Exception breakpoint کسی بھی استثنا کے پھینکے جانے پر پروگرام کی عملدرآمد روکتا ہے — Objective-C اور Swift دونوں خرابیاں۔ Xcode میں، آپ صرف Objective-C استثنا، صرف Swift خرابیاں یا تمام اقسام کی روک تھام ترتیب دے سکتے ہیں۔ یہ ایک ناگزیر آلہ ہے جب ایپلیکیشن کوڈ میں مقام کے واضح اشارے کے بغیر کریش ہو جائے — مثال کے طور پر، ڈی لوکیٹڈ آبجیکٹ تک رسائی کرتے وقت۔
Swift Error Breakpoint ایک خصوصی قسم ہے جو Xcode 11 میں متعارف کرائی گئی۔ یہ اس لمحے کو روکتا ہے جب Swift فنکشن throw کے ذریعے خرابی پھینکتا ہے، اس سے پہلے کہ وہ catch بلاک تک پہنچے۔ یہ دیکھنے کی اجازت دیتا ہے کہ کس فنکشن نے کس دلیل کے ساتھ خرابی پیدا کی، جو متعدد خرابی سے نمٹنے کی سطحوں والی پیچیدہ کال زنجیروں کو ڈیبگ کرتے وقت اہم ہے۔
enum NetworkError: Error {
case invalidURL
case noData
case decodingFailed(String)
}
func loadUserProfile(id: Int) throws -> UserProfile {
guard id > 0 else {
throw NetworkError.invalidURL
}
// Swift Error Breakpoint will stop here on throw
return UserProfile(id: id, name: "Test")
}
علامتی breakpoints KVO اور NotificationCenter کو ڈیبگ کرتے وقت بھی مؤثر ہیں۔ observeValue(forKeyPath:of:change:context:) پر بریک پوائنٹ لگا کر، ڈویلپر ایپلیکیشن میں تمام KVO اطلاعات کو روک سکتا ہے، جو غیر متوقع UI اپ ڈیٹس یا خصوصیت کی نگرانی سے متعلق ریس کنڈیشن کی تشخیص میں مدد کرتا ہے۔
Breakpoints کا مؤثر استعمال صرف ایک لائن پر رکنے سے کہیں آگے جاتا ہے۔ تجربہ کار ڈویلپر بریک پوائنٹ کی اقسام کو LLDB اسکرپٹس، عارضی رکنے والے زونز اور دوبارہ پیدا ہونے والی ڈیبگنگ کے لیے کنفیگریشن برآمد کے ساتھ جوڑتے ہیں۔ آئیے سب سے مفید تکنیکوں کو دیکھتے ہیں، جو Apple اور Google کے انجینئروں کی مشق سے تائید شدہ ہیں۔
مشکل سے پکڑے جانے والے بگز کو ڈیبگ کرتے وقت، طریقہ کے داخلے پر بریک پوائنٹ اور کلیدی متغیر کی تبدیلی پر واچ پوائنٹ کا امتزاج استعمال کریں۔ تفویض سے پہلے ایک لائن بریک پوائنٹ لگائیں، پھر LLDB کمانڈ watchpoint set variable کے ذریعے متغیر پر ایک watchpoint بنائیں۔ جب قدر بدلتی ہے، ڈیبگر رک جائے گا قطع نظر اس کے کہ کوڈ میں کہاں ترمیم ہوئی۔ Google کے مطابق، یہ طریقہ ایک ڈیبگنگ سیشن میں 90% معاملات میں ڈیٹا ریس کا ماخذ تلاش کر سکتا ہے۔
(lldb) watchpoint set variable self->_balance
Watchpoint 1: addr = 0x600000c4b80 size = 8
state = enabled type = w
watchpoint spec: 'self._balance'
(lldb) watchpoint list
1: location = 0x600000c4b80, type = write, variable = '_balance'
Xcode Breakpoint Navigator کے ذریعے بریک پوائنٹس کو گروپ کرنے کی اجازت دیتا ہے۔ ہر منظرنامے کے لیے علیحدہ گروپ بنائیں — مثال کے طور پر، «لاگ ان»، «خریداری»، «نیٹ ورک کی خرابیاں»۔ مخصوص فعالیت کی جانچ کرتے وقت، صرف متعلقہ گروپ کو فعال کریں، باقی کو غیر فعال کریں۔ یہ غلط فعالیت کو روکتا ہے اور بڑے منصوبوں میں ڈیبگنگ کو تیز کرتا ہے جہاں بریک پوائنٹس کی تعداد کئی درجن سے تجاوز کر سکتی ہے۔ گروپ کو فائل میں برآمد کرنا ورژن کنٹرول کے ذریعے ساتھیوں کے ساتھ کنفیگریشن شیئر کرنے کی اجازت دیتا ہے۔
پیچیدہ منظرناموں کے لیے، LLDB بریک پوائنٹ متحرک ہونے پر Python اسکرپٹس کے عملدرآمد کو سپورٹ کرتا ہے۔ بریک پوائنٹ ایکشن میں، script import my_debug_helper; my_debug_helper.log_state() بتائیں۔ یہ لامحدود امکانات کھولتا ہے: خودکار اعدادوشمار جمع، کالوں کے درمیان حالت کا موازنہ، ڈیبگ کوریج رپورٹس کی تخلیق۔ Apple کے مطابق، LLDB Python API CI ٹیسٹنگ کے دوران خودکار کریش تجزیہ کے لیے Xcode Cloud میں استعمال ہوتا ہے۔
اکثر پوچھے گئے سوالات
غیر فعال breakpoints کارکردگی کو متاثر نہیں کرتے — یہ صرف Debug کنفیگریشن میں مرتب ہوتے ہیں۔ فعال بریک پوائنٹ ہارڈویئر انٹرپٹ میکانزم کی وجہ سے عملدرآمد کو سست کرتے ہیں، لیکن صرف ڈیبگنگ کے دوران۔
ہاں، طریقہ یا فنکشن کے نام سے Symbolic breakpoint کے ذریعے۔ LLDB علامت کے کال ہونے پر رک جائے گا، چاہے سورس کوڈ دستیاب نہ ہو۔ مزید برآں، مرحلہ وار نیویگیشن کے لیے LLDB ڈس اسمبلر استعمال کیا جا سکتا ہے۔
Step Over موجودہ لائن کو مکمل طور پر انجام دیتا ہے (فنکشن کالز سمیت) اور اگلی لائن پر رکتا ہے۔ Step Into کال کردہ فنکشن کے اندر جاتا ہے، جس سے اسے مرحلہ وار ڈیبگ کیا جا سکتا ہے۔ Step Out کالر کو کنٹرول واپس کرتا ہے۔
Breakpoints خود بخود پروجیکٹ کے اندر xcuserdata میں محفوظ ہو جاتے ہیں۔ ساتھیوں کے ساتھ شیئر کرنے کے لیے، Breakpoint Navigator → Share کے ذریعے برآمد کریں۔ .xcbkptlist فائل کو ریپوزٹری میں شامل کیا جا سکتا ہے اگر ڈیبگنگ ٹیم کا کام ہو۔
بلڈ کی Debug کنفیگریشن، بریک پوائنٹ کی فعالیت (نیلا آئیکن)، علامتی بریک پوائنٹ کے لیے علامت کی درستگی اور سورس کوڈ کے قابل عمل بائنری سے مماثلت چیک کریں — اکثر Clean Build Folder مدد کرتا ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں