مواد پر جائیں

ایجنٹ سے ناکام ٹیسٹ ڈی بگ کریں

یہ گائیڈ دکھاتی ہے کہ ایسے ناکامی پر ایجنٹ سے ڈی بگر استعمال کیسے کرایا جائے جس کی وضاحت پرنٹ سٹیٹمنٹس نہیں کر پا رہے۔

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 ہے۔ کانٹیکسٹ ونڈو بھر دینے والا ٹول نتیجہ ایسا ٹول ہے جو اُس رَن کو ختم کر دیتا ہے جس کی وہ مدد کر رہا تھا۔