LLDB (Low-Level Debugger) LLVM پروجیکٹ کا ایک نئی نسل کا ڈیبگر ہے، جو iOS، macOS، tvOS اور watchOS پر ایپلیکیشنز کو ڈیبگ کرنے کے لیے Xcode میں شامل ہے۔ GDB کے برعکس، LLDB LLVM کمپائلر کے ساتھ ماڈیولر آرکیٹیکچر استعمال کرتا ہے، جو تیز رفتاری اور درستگی فراہم کرتا ہے۔ LLVM پروجیکٹ کے مطابق، LLDB C، Objective-C، C++ اور Swift میں ڈیبگنگ کو فیچرز کے مکمل سیٹ کے ساتھ سپورٹ کرتا ہے: بریک پوائنٹس، واچ پوائنٹس، میموری معائنہ اور مرحلہ وار عملدرآمد۔
اہم نکات
LLDB ایک اوپن سورس ڈیبگر ہے جو LLVM پروجیکٹ لائبریریوں پر بنایا گیا ہے۔ اس نے Xcode 5 میں GDB کی جگہ لی اور اس کے بعد سے پورے Apple ایکو سسٹم کے لیے بنیادی ڈیبگنگ ٹول بن گیا ہے۔ یک سنگی GDB کے برعکس، LLDB باہمی تعامل کرنے والی لائبریریوں کے ایک سیٹ کے طور پر لاگو کیا گیا ہے: ہر فنکشن — ایکسپریشن پارسنگ سے میموری مینجمنٹ تک — ایک علیحدہ ماڈیول میں رکھا گیا ہے، جو دیکھ بھال اور توسیع کو آسان بناتا ہے۔
LLDB کی اہم صلاحیتوں میں شامل ہیں: کسی بھی قسم کے بریک پوائنٹس سیٹ کرنا، متغیر تبدیلیوں کو ٹریک کرنے کے لیے واچ پوائنٹس، میموری اور رجسٹر معائنہ، مرحلہ وار عملدرآمد، روکے گئے پروگرام کے سیاق و سباق میں صوابدیدی ایکسپریشنز کی تشخیص، اور آٹومیشن کے لیے Python اسکرپٹس چلانا۔ LLVM ریپوزٹری کے مطابق، LLDB 200 سے زیادہ ڈیبگ کمانڈز کو سپورٹ کرتا ہے اور DWARF اور Mach-O فارمیٹس — Apple ایکو سسٹم میں ڈیبگ معلومات کے اہم فارمیٹس — کے ساتھ مطابقت رکھتا ہے۔
LLDB کا ایک اہم فائدہ Clang کے ساتھ گہرا انضمام ہے۔ سورس کوڈ کو پارس اور کمپائل کرنے کے لیے ایک ہی کمپائلر استعمال کرکے، LLDB GDB میں دستیاب نہ ہونے والی درستگی کے ساتھ C++ اور Objective-C ایکسپریشنز کا جائزہ لے سکتا ہے۔ Swift ڈیبگنگ کے لیے، LLDB ایک علیحدہ Swift Language Runtime ماڈیول استعمال کرتا ہے جو زبان کی سیمنٹکس کو سمجھتا ہے: اختیاری اقسام، پروٹوکول، جنیرکس، اور ARC کے ذریعے میموری مینجمنٹ۔
LLDB کا پہلا ورژن 2010 میں LLVM 2.8 کے حصے کے طور پر ظاہر ہوا۔ 2013 تک، اس نے Xcode میں GDB کو مکمل طور پر تبدیل کر دیا تھا۔ 2019 میں، Xcode 11 کی ریلیز کے ساتھ، LLDB کو Swift Error Breakpoints کے لیے سپورٹ اور Swift کے لیے بہتر ایکسپریشن پارسر ملا۔ Apple کے مطابق، iOS 14 سے، سمیلیٹر کے لیے ڈیبگنگ اسٹیک بھی LLDB کے ذریعے کام کرتا ہے، جو پلیٹ فارم کے بنیادی ڈیبگنگ ٹول کے طور پر اس کی حیثیت کی تصدیق کرتا ہے۔
LLDB آرکیٹیکچر مائکرو سروسز کے اصول پر بنایا گیا ہے: ہر ذیلی نظام ایک علیحدہ لائبریری (dylib) کے طور پر موجود ہے، جو ایک مشترکہ API کے ذریعے دوسروں سے منسلک ہوتا ہے۔ یہ اسے GDB سے الگ کرتا ہے، جہاں تمام فنکشنز ایک بائنری میں یکجا ہوتے ہیں۔ ماڈیولر ڈھانچہ LLDB اجزاء کو آزادانہ طور پر استعمال کرنے کی اجازت دیتا ہے — مثال کے طور پر، ایکسپریشن پارسر کو مکمل ڈیبگر کو جوڑے بغیر IDE میں شامل کیا جا سکتا ہے۔
| LLDB جزو | مقصد | لائبریری |
|---|---|---|
| Core | ڈیبگ عمل کا انتظام، واقعات، تھریڈ کی حالتیں | liblldbCore.dylib |
| Expression Parser | ایکسپریشن پارسنگ اور عملدرآمد (C/C++/ObjC/Swift) | liblldbExpression.dylib |
| Symbol File | DWARF، Mach-O، dSYM پڑھنا — ڈیبگ معلومات کے ساتھ کام | liblldbSymbol.dylib |
| Target Control | عملدرآمد کنٹرول: شروع، روک، اقدامات | liblldbTarget.dylib |
| Interpreter | کمانڈ لائن اور REPL موڈ | liblldbInterpreter.dylib |
dSYM ڈیبگ معلومات کی فائلیں ہیں جو Xcode بلڈ کے دوران تیار کرتا ہے۔ LLDB انہیں مشین کوڈ کو سورس کوڈ سے میپ کرنے کے لیے استعمال کرتا ہے: dSYM کے بغیر، ڈیبگر فنکشن ناموں اور کوڈ لائنوں کے بجائے صرف میموری ایڈریس دکھاتا ہے۔ App Store ایپلیکیشنز کے لیے، dSYM فائلیں علیحدہ طور پر Apple سرور پر اپ لوڈ کی جاتی ہیں اور CrashReporter کے ذریعے صارفین سے موصول ہونے والے کریش لاگز کو علامتی بنانے کے لیے استعمال کی جاتی ہیں۔
(lldb) target create MyApp.app
(lldb) image list MyApp
MyApp - "/path/to/MyApp.app/MyApp" (arm64)
(lldb) image lookup -n fetchUserData
Address: MyApp[0x1000a3b40] (MyApp.__TEXT.__text + 12352)
Summary: `ViewController.fetchUserData()` at ViewController.swift:42
LLDB کمانڈز کئی زمروں میں تقسیم ہیں: عملدرآمد کنٹرول، بریک پوائنٹ مینجمنٹ، ڈیٹا معائنہ اور میموری ہیرا پھیری۔ Xcode GUI کے برعکس، LLDB کنسول ڈیبگنگ پر مکمل کنٹرول دیتا ہے اور گرافیکل انٹرفیس کے ذریعے دستیاب نہ ہونے والی کارروائیوں کی اجازت دیتا ہے — مثال کے طور پر، چلتے چلتے متغیر کی قدر تبدیل کرنا یا بریک پوائنٹس کی بلک ایڈیٹنگ۔
Continue, Step Over, Step Into, Step Out — ڈیبگ سائیکل کی بنیاد۔ continue اگلے بریک پوائنٹ تک عملدرآمد دوبارہ شروع کرتا ہے۔ step over موجودہ لائن کو مکمل طور پر انجام دیتا ہے۔ step into کال کردہ طریقہ کے اندر جاتا ہے۔ step out موجودہ فنکشن کو مکمل کرتا ہے اور کالر کوڈ کو کنٹرول واپس کرتا ہے۔ مزید برآں، step with type filter موجود ہے — مخصوص ڈیٹا کی قسم تک قدم۔
(lldb) thread backtrace # کال اسٹیک دکھائیں
* thread #1, queue = 'com.apple.main-thread'
frame #0: 0x1000a3b40 ViewController`fetchUserData()
frame #1: 0x1000a2000 ViewController`viewDidLoad()
frame #2: 0x1a2b345 UIKit`UIViewController.loadView()
(lldb) frame variable # مقامی متغیرات دکھائیں
(Int) userId = 42
(String) endpoint = "https://api.example.com/user/42"
(lldb) thread step-over # Step Over
(lldb) thread step-in # Step Into
LLDB کسی بھی فارمیٹ میں ڈیٹا دیکھنے کے لیے کمانڈز فراہم کرتا ہے: memory read، frame variable، target variable۔ خصوصی نحو po (print object) Objective-C آبجیکٹس پر debugDescription اور Swift اقسام پر description کو کال کرتا ہے۔ کسٹم فارمیٹر type summary add کے ذریعے سیٹ کیے جاتے ہیں — CGRect یا IndexPath جیسی پیچیدہ ساختوں کو ڈیبگ کرنے کے لیے مفید۔
(lldb) po userProfile # آبجیکٹ کی تفصیل دکھائیں
<UserProfile: 0x600000c4b80>
- name: "John"
- age: 30
- email: "john@example.com"
(lldb) expression userProfile.age = 31 # قدر تبدیل کریں
(Int) $R0 = 31
(lldb) memory read 0x600000c4b80 0x600000c4bc0
0x600000c4b80: 6a 6f 68 6e 00 00 00 00 1e 00 00 00 00 00 00 00
ایکسپریشن تشخیص LLDB کی سب سے طاقتور خصوصیات میں سے ایک ہے، جو GDB کے غلبے کے وقت موجود نہیں تھی۔ LLDB روکے گئے پروگرام کے سیاق و سباق میں C، Objective-C، C++ اور Swift میں صوابدیدی کوڈ پر عملدرآمد کر سکتا ہے، جس میں طریقوں کو کال کرنا، آبجیکٹ بنانا اور حالت میں تبدیلی شامل ہے۔ یہ ایپلیکیشن کو دوبارہ شروع اور دوبارہ کمپائل کیے بغیر مفروضوں کی جانچ کرنے کی اجازت دیتا ہے۔
expression کمانڈ ڈیبگ کیے جا رہے عمل کے رن ٹائم پر ایک ایکسپریشن کو کمپائل اور انجام دیتا ہے۔ -O پرچم (object description) po کو متحرک کرتا ہے۔ کثیر السطور ایکسپریشنز کے لیے، expression -l Swift -- استعمال کریں۔ LLDB Clang یا Swift Compiler کے ذریعے فوری طور پر کوڈ کمپائل کرتا ہے، نتیجہ کو موجودہ سیاق و سباق میں ضم کرتا ہے اور قدر واپس کرتا ہے۔ Apple کے مطابق، پیچیدگی کے لحاظ سے ایک ایکسپریشن 10–50 ms میں کمپائل ہوتا ہے۔
(lldb) expr -l Swift -- UIAlertController(title: "Test", message: nil,
preferredStyle: .alert)
(lldb) expr let $arr = [1, 2, 3].map { $0 * 2 }
(lldb) po $arr
▿ 3 elements
- 0 : 2
- 1 : 4
- 2 : 6
LLDB نہ صرف پڑھنے کی اجازت دیتا ہے بلکہ ڈیبگنگ کے دوران آبجیکٹس اور متغیرات کی حالت کو تبدیل کرنے کی بھی اجازت دیتا ہے۔ یہ کنارے کی صورتوں کی جانچ کے لیے اہم ہے: کسی متغیر کو nil پر سیٹ کیا جا سکتا ہے، UI عنصر کا رنگ تبدیل کیا جا سکتا ہے، یا سرور کا جواب براہ راست ڈیبگر میں تبدیل کیا جا سکتا ہے، بغیر دوبارہ کمپائل اور دوبارہ شروع کیے۔ یہ تکنیک گیم ڈیولپمنٹ اور لمبی روانی والی ایپلیکیشنز میں بڑے پیمانے پر استعمال ہوتی ہے، جہاں دوبارہ شروع کرنے میں زیادہ وقت لگتا ہے۔
(lldb) expr self.label.text = @"Updated"
(lldb) expr -l Swift -- (self as! UIViewController).view.backgroundColor = .red
(lldb) expr let $snapshot = self.view.debugQuickLookObject()
LLDB میں Python API ڈیبگنگ آٹومیشن کے لیے اسکرپٹ لکھنے کی اجازت دیتا ہے۔ Python کے ذریعے، کسٹم کمانڈز بنائی جا سکتی ہیں، بریک پوائنٹ واقعات کو ہینڈل کیا جا سکتا ہے، رپورٹس تیار کی جا سکتی ہیں، اور ڈیبگر کے رویے کو بھی اوور رائیڈ کیا جا سکتا ہے۔ بلٹ ان Python 3 انٹرپریٹر lldb ماڈیول کے ذریعے مکمل ڈیبگنگ API تک رسائی کے ساتھ براہ راست LLDB کے اندر چلتا ہے۔
Python اسکرپٹ میں @classmethod ڈیکوریٹر کے ذریعے ایک نیا LLDB کمانڈ رجسٹر کیا جا سکتا ہے۔ اسکرپٹ درآمد کرنے کے بعد، کمانڈ بلٹ ان کی طرح دستیاب ہو جاتا ہے۔ مثال کے طور پر، printvars کمانڈ موجودہ فریم کے تمام متغیرات کو ان کی اقسام اور اقدار کے ساتھ، ایک مخصوص پروجیکٹ کے لیے فارمیٹ کرکے آؤٹ پٹ کر سکتا ہے۔ Stack Overflow پر iOS ڈیویلپرز کے سروے کے مطابق، آٹومیشن عام ڈیبگ آپریشنز کے وقت کو 60–80% تک کم کر دیتی ہے۔
import lldb
class PrintVarsCommand:
@classmethod
def register_class(cls, debugger, _):
handler = PrintVarsCommand()
debugger.HandleCommand('command script add -c \
print_vars.PrintVarsCommand printvars')
def __call__(self, debugger, command, exe_ctx, result):
frame = exe_ctx.frame
for var in frame.variables:
result.AppendMessage(f"{var.name}: {var.type} = {var.value}")
Python API کے ذریعے، ایک اسکرپٹ کو بریک پوائنٹ فائرنگ سے منسلک کیا جا سکتا ہے۔ بریک پوائنٹ سیٹ کریں، پھر breakpoint command add چلائیں اور Python فنکشن بتائیں۔ یہ دستی مداخلت کے بغیر خود بخود حالت لاگ کرنے، ڈیٹا کو اینالیٹکس میں بھیجنے یا انویریئنٹس چیک کرنے کی اجازت دیتا ہے۔ LLVM کے مطابق، یہ نقطہ نظر Apple کے بنیادی ڈھانچے میں ڈیولپمنٹ کے دوران کارکردگی کے میٹرکس جمع کرنے کے لیے استعمال ہوتا ہے۔
(lldb) breakpoint set -f Model.swift -l 100
(lldb) breakpoint command add 1 -s python -o "frame = exe_ctx.frame;
print([var.name for var in frame.variables])"
REPL (Read-Eval-Print Loop) LLDB کا ایک انٹرایکٹو موڈ ہے، جسے lldb --repl کمانڈ یا Xcode ڈیبگ کنسول کے ذریعے بلایا جاتا ہے۔ REPL میں، آپ پلے گراؤنڈ کی طرح Swift یا C کوڈ پر عملدرآمد کر سکتے ہیں، فوری فیڈ بیک کے ساتھ۔ LLDB ہر لائن کو کمپائل کرتا ہے، اسے انجام دیتا ہے اور نتیجہ دکھاتا ہے — APIs کے ساتھ تجربہ کرنے، الگورتھم پروٹو ٹائپ کرنے اور پروجیکٹ بنائے بغیر زبان کی نئی خصوصیات سیکھنے کے لیے آسان۔
(lldb) --repl
1> let numbers = [1, 2, 3, 4, 5]
2> numbers.filter { $0 % 2 == 0 }
$R0: [Int] = 2 values {
[0] = 2
[1] = 4
}
3> let result = numbers.reduce(0, +)
$R1: Int = 15
REPL موڈ import کے ذریعے ماڈیولز اور فریم ورک لوڈ کرنے کی بھی حمایت کرتا ہے۔ مثال کے طور پر، REPL میں import UIKit پوری UIKit لائبریری لوڈ کرتا ہے، اور UI عناصر بنائے جا سکتے ہیں، رکاوٹیں چیک کی جا سکتی ہیں اور اینیمیشنز آزمائی جا سکتی ہیں۔ یہ iOS ڈیویلپرز کے لیے ایک منفرد صلاحیت ہے، جو GDB میں دستیاب نہیں ہے — ایک ہی ماحول میں ڈیبگنگ اور پروٹو ٹائپنگ۔
Swift کمپائلر کے ساتھ انضمام کی بدولت، LLDB REPL Apple کے کورسز میں Swift سکھانے کے لیے استعمال ہوتا ہے۔ طلباء پروجیکٹ سیٹ اپ سے مشغول ہوئے بغیر، لائن بہ لائن کوڈ پر عملدرآمد کر سکتے ہیں، اقسام اور نتائج دیکھ سکتے ہیں۔ یہ نقطہ نظر فعال تعلیم کے طریقہ کار کی پیروی کرتا ہے، جہاں انٹرایکٹو فیڈ بیک کمپیوٹر سائنس ایجوکیشن میں تحقیق کے مطابق مواد کی سمجھ کو 40% تک تیز کرتا ہے۔
اکثر پوچھے گئے سوالات
LLDB ایک ماڈیولر LLVM آرکیٹیکچر پر بنایا گیا ہے، جو اسے ایکسپریشن تشخیص کی رفتار اور جدید زبانوں (Swift) کی حمایت میں فائدہ دیتا ہے۔ GDB ایک یک سنگی ڈیبگر ہے جو Swift کو سپورٹ نہیں کرتا اور اس میں محدود اسکرپٹنگ صلاحیتیں ہیں۔
xcode-select --install کے ذریعے Command Line Tools انسٹال کریں، پھر ٹرمینل میں lldb --repl چلائیں۔ LLDB /Library/Developer/CommandLineTools/usr/bin/ پر دستیاب ہے۔
ہاں، lldb --attach-pid PID یا process attach --name AppName کے ذریعے۔ LLDB عمل کو روک دے گا، جس کے بعد ایپلیکیشن کو دوبارہ شروع کیے بغیر تمام معیاری ڈیبگ کمانڈز دستیاب ہیں۔
dSYM ڈیبگ معلومات کی فائلیں غائب ہیں۔ Build Settings چیک کریں: Generate Debug Symbols کو YES اور Debug Information Format کو DWARF with dSYM File ہونا چاہیے۔
LLDB خود بخود ہسٹری کو ~/.lldb/lldb-history میں محفوظ کرتا ہے۔ ایکسپورٹ کرنے کے لیے، session save filename.txt استعمال کریں — کمانڈ موجودہ سیشن کی تمام عملدرآمد کردہ کمانڈز کو ٹیکسٹ فائل میں محفوظ کرتا ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں