ایجنٹ سے ناکام ٹیسٹ ڈی بگ کریں
یہ گائیڈ دکھاتی ہے کہ ایسے ناکامی پر ایجنٹ سے ڈی بگر استعمال کیسے کرایا جائے جس کی وضاحت پرنٹ سٹیٹمنٹس نہیں کر پا رہے۔
debug ٹول ایک حقیقی Debug Adapter Protocol سیشن چلاتا ہے۔ رکا ہوا فریم اُس لمحے کے ہر سوال کا جواب ایک ہی بار میں دے دیتا ہے — ہر لوکل، ہر کالر، اور فریم کے اپنے اسکوپ میں جانچا گیا ایکسپریشن — جبکہ پرنٹ سٹیٹمنٹ صرف اُسی سوال کا جواب دیتا ہے جو چلانے سے پہلے آپ کو سوچنے میں آیا تھا۔
شروع کرنے سے پہلے
سیکشن کا عنوان “شروع کرنے سے پہلے”یہ ٹول سطح پر موجود رہتا ہے تاکہ ایجنٹ اندازہ لگانے کے بجائے پوچھ سکے کہ کچھ بھی قابلِ استعمال کیوں نہیں۔ اڈاپٹر واقعی اُسی وقت شروع ہو سکتا ہے جب یہ دونوں باتیں پوری ہوں:
- چیک آؤٹ میں ایک پروجیکٹ مارکر ہو، اور
- اڈاپٹر کی بائنری حل ہوتی ہو۔
ایجنٹ سے جانچنے کو کہیں:
debug(op: "adapters")یہ جو کچھ ملا وہ بتاتا ہے، یا وضاحت کرتا ہے کہ اڈاپٹر کو دونوں حصے درکار ہیں۔
| زبان | اڈاپٹر | مارکر | انسٹال |
|---|---|---|---|
| Dart / Flutter | dart debug_adapter |
pubspec.yaml |
SDK کے ساتھ آتا ہے — کرنے کو کچھ نہیں |
| Python | python3 -m debugpy.adapter |
pyproject.toml, setup.py, requirements.txt |
pip install debugpy |
| Rust / C / C++ | lldb-dap |
Cargo.toml, CMakeLists.txt |
LLVM کے ساتھ آتا ہے |
| Go | dlv dap |
go.mod |
go install github.com/go-delve/delve/cmd/dlv@latest |
پہلے بریک پوائنٹ لگائیں، پھر لانچ کریں
سیکشن کا عنوان “پہلے بریک پوائنٹ لگائیں، پھر لانچ کریں”ترتیب اہمیت رکھتی ہے اور ٹول اسے نافذ کرتا ہے: بریک پوائنٹس سیشن وجود میں آنے سے پہلے لگائے جا سکتے ہیں، کیونکہ پروٹوکول اسی ترتیب کا تقاضا کرتا ہے۔
ایجنٹ سے کچھ ایسا کہیں:
bin/main.dartمیںcomputeفنکشن غلط ویلیو لوٹاتا ہے۔ جس لائن میںproductاسائن ہوتا ہے اُس پر بریک پوائنٹ لگائیں، اسے ڈی بگر کے تحت لانچ کریں اور بتائیں کہaاورbاصل میں کیا ہیں۔
یہ تقریباً یہ چلائے گا:
debug(op: "breakpoints", file: "bin/main.dart", lines: [7])debug(op: "launch", program: "bin/main.dart")لانچ بتاتا ہے کہ یہ کہاں رکا:
Launched bin/main.dart on dart (session dart-1). Stopped: breakpoint. Use `stack` to see where.فریم پڑھیں
سیکشن کا عنوان “فریم پڑھیں”debug(op: "stack")→ #1 compute (bin/main.dart:7:3) #2 main (bin/main.dart:2:18)پھر اس کے اندر چلیں:
debug(op: "scopes", frame_id: 1)→ Locals (reference 12)
debug(op: "variables", reference: 12)→ a (int) = 6 b (int) = 7 product (int) = 42جن آبجیکٹ کے اندر بچے ہوں، وہ [expand: reference N] بتاتی ہے — مگر صرف اُس وقت جب واقعی اس کے پیچھے کچھ ہو، چنانچہ ایجنٹ جس ایکسپینشن کو استعمال نہ کر سکے، وہ کبھی پیش نہیں کی جاتی۔
جو چیز بطور لوکل نظر نہ آئے، اُس کے لیے:
debug(op: "evaluate", expression: "config.timeout.inSeconds", frame_id: 1)قدم بہ قدم چلیں
سیکشن کا عنوان “قدم بہ قدم چلیں”| آپ کیا چاہتے ہیں | آپریشن |
|---|---|
| اگلے اسٹاپ تک چلائیں | continue |
| اگلی لائن، وہی فریم | step_over |
| کال کے اندر | step_in |
| کالر تک باہر | step_out |
| چلتے پروگرام کو روکیں | pause |
پہلے سے چل رہی کسی چیز سے اٹیچ کریں
سیکشن کا عنوان “پہلے سے چل رہی کسی چیز سے اٹیچ کریں”ایسے پروسیس کے لیے جو پھنس گیا ہو، اُس کے بجائے جو آپ شروع کر رہے ہوں:
debug(op: "attach", port: 5858)اختتام
سیکشن کا عنوان “اختتام”debug(op: "terminate")سیشن ہمیشہ ختم کریں۔ ڈی بگ اڈاپٹر ایک رکے ہوئے پروسیس کا مالک ہوتا ہے جو وہ سب تھامے ہوتا ہے جو وہ پروسیس تھامے ہوتا ہے — کوئی پورٹ، کوئی لاک، کوئی ڈیٹا بیس کنکشن۔
محدود آؤٹ پٹ
سیکشن کا عنوان “محدود آؤٹ پٹ”گہرے آبجیکٹ گراف پر variables ایکسپینشن فطرتاً بے حد ہوتی ہے — ایک Flutter ویجٹ پورے ایلیمنٹ ٹری تک پہنچ جاتا ہے۔ فی اسکوپ بچوں کی حد 50، ویلیوز کی 400 حروف اور اسٹیک فریمز کی 30 ہے۔ کانٹیکسٹ ونڈو بھر دینے والا ٹول نتیجہ ایسا ٹول ہے جو اُس رَن کو ختم کر دیتا ہے جس کی وہ مدد کر رہا تھا۔
متعلقہ
سیکشن کا عنوان “متعلقہ”- کوڈ انٹیلیجنس — ڈی بگر، کمپائلر اور میچر مختلف سوالوں کے جواب کیوں دیتے ہیں
- بلٹ اِن ایجنٹ ٹولز — ہر
debugآپریشن اور آرگیومنٹ - ایجنٹ کی تشخیص کریں — جب مسئلہ کوڈ کا نہیں، ایجنٹ کا ہو