ব্রেকপয়েন্ট (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 প্রোগ্রাম না থামিয়ে স্বয়ংক্রিয় অ্যাকশন সম্পাদন করতে পারে। এটি 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 সরাসরি ডিবাগার কনসোল থেকে breakpoints-এর প্রোগ্রাম্যাটিক পরিচালনার জন্য ডজন ডজন কমান্ড সমর্থন করে। এটি GUI-এর মাধ্যমে উপলব্ধ নয় এমন ক্ষমতা প্রদান করে: রেগুলার এক্সপ্রেশন দ্বারা breakpoints-এর গণ নিষ্ক্রিয়করণ, গতিশীলভাবে লোড করা লাইব্রেরিতে breakpoints সেট করা এবং জটিল মাল্টি-স্টেপ ট্রিগার তৈরি করা।
| LLDB কমান্ড | বিবরণ | উদাহরণ |
|---|---|---|
| breakpoint set | ব্রেকপয়েন্ট সেট করুন | breakpoint set -f ViewController.swift -l 42 |
| breakpoint list | সব breakpoints দেখান | breakpoint list |
| breakpoint disable | নম্বর দ্বারা breakpoint নিষ্ক্রিয় করুন | 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 ফাংশন নামের জন্য রেগুলার এক্সপ্রেশন দ্বারা breakpoints সেট করা সমর্থন করে। এটি একটি প্যাটার্নের সাথে মেলে এমন সমস্ত মেথড ইন্টারসেপ্ট করতে দেয় — উদাহরণস্বরূপ, একটি নির্দিষ্ট ক্লাসে 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:)-এ breakpoint সেট করে, ডেভেলপার অ্যাপ্লিকেশনের সমস্ত KVO বিজ্ঞপ্তি ইন্টারসেপ্ট করতে পারে, যা অপ্রত্যাশিত UI আপডেট বা সম্পত্তি পর্যবেক্ষণ সম্পর্কিত রেস কন্ডিশন নির্ণয়ে সহায়তা করে।
Breakpoints-এর কার্যকর ব্যবহার কেবল একটি লাইনে থামার চেয়ে অনেক বেশি এগিয়ে যায়। অভিজ্ঞ ডেভেলপাররা breakpoint ধরনগুলিকে LLDB স্ক্রিপ্ট, অস্থায়ী থামানোর জোন এবং পুনরুৎপাদনযোগ্য ডিবাগিংয়ের জন্য কনফিগারেশন এক্সপোর্টের সাথে একত্রিত করে। আসুন সবচেয়ে দরকারী কৌশলগুলি দেখি, যা Apple এবং Google ইঞ্জিনিয়ারদের অনুশীলন দ্বারা সমর্থিত।
কঠিন-থেকে-ধরা বাগ ডিবাগ করার সময়, মেথড এন্ট্রিতে breakpoint এবং একটি মূল ভেরিয়েবল পরিবর্তনে ওয়াচপয়েন্টের সংমিশ্রণ ব্যবহার করুন। অ্যাসাইনমেন্টের আগে একটি লাইন breakpoint সেট করুন, তারপর 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-এর মাধ্যমে breakpoints গ্রুপ করার অনুমতি দেয়। প্রতিটি পরিস্থিতির জন্য একটি পৃথক গ্রুপ তৈরি করুন — উদাহরণস্বরূপ, “লগইন”, “ক্রয়”, “নেটওয়ার্ক ত্রুটি”। নির্দিষ্ট কার্যকারিতা পরীক্ষা করার সময়, শুধুমাত্র সংশ্লিষ্ট গ্রুপটি সক্রিয় করুন, বাকিগুলি নিষ্ক্রিয় করুন। এটি মিথ্যা সক্রিয়করণ প্রতিরোধ করে এবং বড় প্রকল্পগুলিতে ডিবাগিং গতি বাড়ায় যেখানে breakpoints-এর সংখ্যা কয়েক ডজন ছাড়িয়ে যেতে পারে। একটি গ্রুপ ফাইলে এক্সপোর্ট করা সংস্করণ নিয়ন্ত্রণের মাধ্যমে সহকর্মীদের সাথে কনফিগারেশন ভাগ করে নেওয়ার অনুমতি দেয়।
জটিল পরিস্থিতির জন্য, LLDB breakpoint সক্রিয় হলে Python স্ক্রিপ্ট নির্বাহ সমর্থন করে। Breakpoint অ্যাকশনে, script import my_debug_helper; my_debug_helper.log_state() নির্দিষ্ট করুন। এটি সীমাহীন সম্ভাবনা উন্মুক্ত করে: স্বয়ংক্রিয় পরিসংখ্যান সংগ্রহ, কলের মধ্যে অবস্থার তুলনা, ডিবাগ কভারেজ রিপোর্ট তৈরি করা। Apple-এর মতে, LLDB Python API CI পরীক্ষার সময় স্বয়ংক্রিয় ক্র্যাশ বিশ্লেষণের জন্য Xcode Cloud-এ ব্যবহার করা হয়।
সচরাচর জিজ্ঞাসিত প্রশ্ন
নিষ্ক্রিয় breakpoints পারফরম্যান্সকে প্রভাবিত করে না — এগুলি শুধুমাত্র Debug কনফিগারেশনে কম্পাইল হয়। সক্রিয় breakpoints হার্ডওয়্যার ইন্টারাপ্ট মেকানিজমের কারণে নির্বাহ ধীর করে, কিন্তু শুধুমাত্র ডিবাগিংয়ের সময়।
হ্যাঁ, Symbolic breakpoint-এর মাধ্যমে মেথড বা ফাংশন নামে। LLDB সিম্বল কল হলে থামবে, এমনকি সোর্স কোড উপলব্ধ না থাকলেও। অতিরিক্তভাবে, ধাপে ধাপে নেভিগেশনের জন্য LLDB ডিসঅ্যাসেম্বলার ব্যবহার করা যেতে পারে।
Step Over বর্তমান লাইনটি সম্পূর্ণরূপে নির্বাহ করে (ফাংশন কল সহ) এবং পরবর্তী লাইনে থামে। Step Into কল করা ফাংশনের ভিতরে যায়, এটিকে ধাপে ধাপে ডিবাগ করার অনুমতি দেয়। Step Out কলারকে নিয়ন্ত্রণ ফিরিয়ে দেয়।
Breakpoints স্বয়ংক্রিয়ভাবে প্রকল্পের ভিতরে xcuserdata-এ সংরক্ষিত হয়। সহকর্মীদের সাথে ভাগ করতে, Breakpoint Navigator → Share-এর মাধ্যমে এক্সপোর্ট ব্যবহার করুন। .xcbkptlist ফাইলটি রিপোজিটরিতে যোগ করা যেতে পারে যদি ডিবাগিং টিমের প্রচেষ্টা হয়।
বিল্ডের Debug কনফিগারেশন, breakpoint-এর সক্রিয়তা (নীল আইকন), সিম্বলিক breakpoints-এর জন্য সিম্বলের সঠিকতা এবং সোর্স কোডের এক্সিকিউটেবল বাইনারির সাথে মিল পরীক্ষা করুন — প্রায়ই Clean Build Folder সাহায্য করে।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন