ডিবাগার

অ্যান্ড্রয়েড গেম ডেভেলপমেন্ট এক্সটেনশন ব্যবহার করার সময় ভিজ্যুয়াল স্টুডিও ডিবাগার (এলএলডিবি) দিয়ে আপনার প্রকল্প ডিবাগ করুন।

ডিবাগার চালান

আপনি ডিবাগার চালানোর আগে, আপনাকে অবশ্যই Android-এ আপনার গেম তৈরি, স্থাপন এবং চালাতে সক্ষম হতে হবে। বিস্তারিত জানার জন্য নমুনা চালান বিভাগটি দেখুন।

একবার আপনি নিশ্চিত হন যে আপনি ডিবাগার ছাড়াই আপনার গেমটি চালাতে পারেন, আপনি F5 টিপে বা ডিবাগ মেনুতে স্টার্ট ডিবাগিং আইটেমটি নির্বাচন করে ডিবাগার ব্যবহার করতে পারেন। ডিবাগার গেমের সাথে সংযুক্ত হওয়ার সময় আপনার একটি ডায়ালগ দেখতে হবে।

ডিবাগার চালু করতে 10 সেকেন্ড থেকে 1 মিনিট বা তার বেশি সময় লাগে আপনার অ্যাপ্লিকেশানের আকার এবং স্টার্টআপের সময় লোড হওয়া চিহ্নের পরিমাণের উপর নির্ভর করে। প্রথমবার একটি নতুন ডিভাইসে সংযুক্ত করার সময় এটি আরও বেশি সময় নেয় কারণ ডিবাগারকে ডিভাইস থেকে হোস্ট মেশিনে কিছু অ্যান্ড্রয়েড লাইব্রেরি ডাউনলোড করতে হয়। যদি এটি একটি নতুন ডিভাইসের সাথে আপনার প্রথম কয়েকটি প্রচেষ্টায় 1 মিনিটের বেশি সময় নেয় তবে ডিবাগ সেশনটি বাতিল করার এবং তারপরে এটি পুনরায় চালু করার কথা বিবেচনা করুন।

আপনি যখন এইভাবে ডিবাগার চালান, গেমটি শুরু হয় ওয়েটিং ফর ডিবাগার মোডে এবং ডিবাগার সংযোগ না হওয়া পর্যন্ত এটি আপনার গেমের কোনো কোড কার্যকর করবে না। এটি আপনাকে আপনার গেমের প্রারম্ভিক বিভাগটি ডিবাগ করার অনুমতি দেয়।

আপনি ভিজ্যুয়াল স্টুডিও ডকুমেন্টেশন পড়ে নির্দিষ্ট ভিজ্যুয়াল স্টুডিও ডিবাগার বৈশিষ্ট্য সম্পর্কে আরও তথ্য পেতে পারেন।

একটি প্রক্রিয়া সংযুক্ত করা হচ্ছে

আপনি যদি একটি গেম ডিবাগ করতে চান যা ইতিমধ্যেই একটি শারীরিক বা ভার্চুয়াল ডিভাইসে চলছে, আপনি ভিজ্যুয়াল স্টুডিও থেকে ডিবাগারটিকে প্রক্রিয়াটিতে সংযুক্ত করতে পারেন।

ভিজ্যুয়াল স্টুডিওতে, নিশ্চিত করুন যে একটি Android সমাধান খোলা আছে এবং:

  1. ডিবাগ মেনুতে যান এবং প্রক্রিয়াতে সংযুক্ত করুন... নির্বাচন করুন।
  2. ট্রান্সপোর্ট ড্রপডাউন থেকে, অ্যান্ড্রয়েড গেম ডেভেলপমেন্ট এক্সটেনশন নির্বাচন করুন।
  3. কোয়ালিফায়ার ড্রপডাউন থেকে, আপনার অ্যান্ড্রয়েড ডিভাইস নির্বাচন করুন।
  4. উপলব্ধ প্রক্রিয়াগুলির তালিকা থেকে গেম প্রক্রিয়াটি নির্বাচন করুন এবং সংযুক্ত করুন ক্লিক করুন।

প্রক্রিয়া সংযুক্ত করুন

LLDB.Shell কমান্ড নির্বাহ করা হচ্ছে

একটি ডিবাগিং সেশন সক্রিয় থাকলে, LLDB.Shell কমান্ড চালানোর জন্য ভিজ্যুয়াল স্টুডিওর কমান্ড উইন্ডো ব্যবহার করুন।

কমান্ড বিন্যাস:

LLDB.Shell [command]

উদাহরণ:

>LLDB.Shell expr myIntVariable = 9
Status:  Success
Output Message:
(int) $2 = 9

ডেটা ভিজ্যুয়ালাইজেশন

ফরম্যাট স্পেসিফায়ার

আপনি ফর্ম্যাট স্পেসিফায়ার ব্যবহার করে Autos , Locals , Watch , এবং পরিবর্তনশীল DataTip উইন্ডোতে একটি মান প্রদর্শিত হয় এমন বিন্যাস পরিবর্তন করতে পারেন।

ফর্ম্যাট স্পেসিফায়ারগুলি এক্সপ্রেশনের শেষে পাওয়া যায়। তারা একটি ছোট স্ট্রিং দ্বারা অনুসরণ একটি কমা দিয়ে শুরু হয়। উদাহরণস্বরূপ, _myInt, ,x এক্সপ্রেশনে _myInt,x স্পেসিফায়ার myInt কে ছোট হাতের হেক্সাডেসিমেল হিসাবে ফর্ম্যাট করবে।

ফরম্যাট স্পেসিফায়ারগুলি আপনার ন্যাটভিস এক্সপ্রেশনে যুক্ত করে সরাসরি ওয়াচ উইন্ডোতে বা অটো , লোকাল এবং ডেটাটিপ উইন্ডোতে ব্যবহার করা যেতে পারে। আরও তথ্যের জন্য Natvis দেখুন।

সমর্থন স্পেসিফায়ারদের তালিকা

ফরম্যাটের নাম স্পেসিফায়ার(গুলি) বর্ণনা
বুলিয়ান এটিকে একটি সত্য/মিথ্যা বুলিয়ান হিসাবে দেখান, প্রচলিত নিয়ম ব্যবহার করে যে 0 মিথ্যা এবং অন্য সবকিছু সত্য
বাইনারি এটিকে বিটের ক্রম হিসাবে দেখান
বাইনারি, কোন লিডিং 0 বি bb এটিকে 0b উপসর্গ ছাড়া বিটের ক্রম হিসাবে দেখান
বাইট y বাইট দেখান, কিন্তু ASCII অক্ষর হিসেবেও প্রদর্শন করার চেষ্টা করুন
যেমন (int *) c.sp.x = 50 f8 bf 5f ff 7f 00 00 P..._...
ASCII সহ বাইট Y বাইট দেখান, কিন্তু ASCII অক্ষর হিসেবেও প্রদর্শন করার চেষ্টা করুন
যেমন (int *) c.sp.x = 50 f8 bf 5f ff 7f 00 00 P..._...
চরিত্র বাইটগুলিকে ASCII অক্ষর হিসাবে দেখান
যেমন (int *) c.sp.x = P\xf8\xbf_\xff\x7f\0\0
মুদ্রণযোগ্য অক্ষর মুদ্রণযোগ্য ASCII অক্ষর হিসাবে বাইট দেখান
যেমন (int *) c.sp.x = P..._...
জটিল ভাসা এই মানটিকে একটি জটিল ভাসমান-বিন্দু সংখ্যার বাস্তব এবং কাল্পনিক অংশ হিসাবে ব্যাখ্যা করুন
যেমন (int*) c.sp.x = 2.76658e+19 + 4.59163e-41i
দশমিক d, i এটি একটি স্বাক্ষরিত পূর্ণসংখ্যা সংখ্যা হিসাবে দেখান (এটি একটি কাস্ট সম্পাদন করে না, এটি কেবল চিহ্ন সহ একটি পূর্ণসংখ্যা হিসাবে বাইটগুলি দেখায়)
গণনা E,en এটিকে একটি গণনা হিসাবে দেখান, উপলব্ধ থাকলে মানটির নাম মুদ্রণ করুন বা অন্যথায় পূর্ণসংখ্যার মান
যেমন (enum enumType) val_type = eValue2
হেক্সাডেসিমাল - ছোট হাতের অক্ষর x, জ এটিকে ছোট হাতের হেক্সাডেসিমেল নোটেশনে দেখান (এটি একটি কাস্ট সম্পাদন করে না, এটি কেবল বাইটগুলিকে হেক্স হিসাবে দেখায়)
হেক্সাডেসিমেল - বড় হাতের অক্ষর এক্স, এইচ এটিকে বড় হাতের হেক্সাডেসিমেল নোটেশনে দেখান (এটি একটি কাস্ট সম্পাদন করে না, এটি কেবল বাইটগুলিকে হেক্স হিসাবে দেখায়)
হেক্সাডেসিমেল - ছোট হাতের অক্ষর, কোন লিডিং 0x নেই xb, hb এটিকে 0x উপসর্গ ছাড়াই ছোট হাতের হেক্সাডেসিমেল স্বরলিপিতে দেখান (এটি একটি কাস্ট সম্পাদন করে না, এটি কেবল বাইটগুলিকে হেক্স হিসাবে দেখায়)
হেক্সাডেসিমেল - বড় হাতের অক্ষর, কোন লিডিং 0x নেই Xb, Hb এটিকে 0x উপসর্গ ছাড়াই বড় হাতের হেক্সাডেসিমেল স্বরলিপিতে দেখান (এটি একটি কাস্ট সম্পাদন করে না, এটি কেবল বাইটগুলিকে হেক্স হিসাবে দেখায়)
ভাসা এটি একটি ফ্লোটিং-পয়েন্ট সংখ্যা হিসাবে দেখান (এটি একটি কাস্ট সম্পাদন করে না, এটি কেবল বাইটকে একটি IEEE754 ফ্লোটিং-পয়েন্ট মান হিসাবে ব্যাখ্যা করে)
অক্টাল o অক্টাল নোটেশনে এটি দেখান
ওএস টাইপ এটি একটি MacOS OSType হিসাবে দেখান
যেমন (ফ্লোট) x = '\n\x1f\xd7\n'
স্ট্রিং - সি-স্ট্রিং s এটি একটি 0-সমাপ্ত সি স্ট্রিং হিসাবে দেখান
যেমন "হ্যালো ওয়ার্ল্ড"
স্ট্রিং - সি-স্ট্রিং, কোন উদ্ধৃতি চিহ্ন নেই sb উদ্ধৃতি চিহ্ন ছাড়া এটিকে 0-সমাপ্ত সি স্ট্রিং হিসাবে দেখান,
যেমন হ্যালো ওয়ার্ল্ড
স্ট্রিং - UTF-8 s8 এটিকে 0-টার্মিনেটেড UTF-8 স্ট্রিং হিসাবে দেখান
যেমন u8"হ্যালো ওয়ার্ল্ড ☕"
স্ট্রিং - UTF-8, কোন উদ্ধৃতি চিহ্ন নেই s8 খ উদ্ধৃতি চিহ্ন ছাড়াই এটিকে 0-সমাপ্ত UTF-8 স্ট্রিং হিসাবে দেখান
যেমন হ্যালো ওয়ার্ল্ড ☕
স্ট্রিং - UTF-16 su এটিকে 0-টার্মিনেটেড UTF-16 স্ট্রিং হিসাবে দেখান
যেমন আপনি "হ্যালো ওয়ার্ল্ড ☕"
স্ট্রিং - UTF-16, কোন উদ্ধৃতি চিহ্ন নেই উপ উদ্ধৃতি চিহ্ন ছাড়াই এটিকে 0-সমাপ্ত UTF-16 স্ট্রিং হিসাবে দেখান
যেমন হ্যালো ওয়ার্ল্ড ☕
স্ট্রিং - UTF-32 s32 এটিকে 0-টার্মিনেটেড UTF-32 স্ট্রিং হিসাবে দেখান
যেমন ইউ"হ্যালো ওয়ার্ল্ড ☕"
স্ট্রিং - UTF-32, কোন উদ্ধৃতি চিহ্ন নেই s32b এটিকে উদ্ধৃতি চিহ্ন ছাড়াই 0-সমাপ্ত UTF-32 স্ট্রিং হিসাবে দেখান
যেমন হ্যালো ওয়ার্ল্ড ☕
ইউনিকোড16 এটিকে UTF-16 অক্ষর হিসাবে দেখান
যেমন (float) x = 0xd70a 0x411f
ইউনিকোড32 U32 এটি UTF-32 অক্ষর হিসাবে দেখান
যেমন (float) x = 0x411fd70a
স্বাক্ষরবিহীন দশমিক u এটি একটি স্বাক্ষরবিহীন পূর্ণসংখ্যা হিসাবে দেখান (এটি একটি কাস্ট সম্পাদন করে না, এটি কেবল স্বাক্ষরবিহীন পূর্ণসংখ্যা হিসাবে বাইটগুলি দেখায়)
নির্দেশক পি এটিকে একটি নেটিভ পয়েন্টার হিসাবে দেখান (যদি না এটি সত্যিই একটি পয়েন্টার হয়, ফলাফলের ঠিকানা সম্ভবত অবৈধ হবে)
জটিল পূর্ণসংখ্যা আমি এই মানটিকে একটি জটিল পূর্ণসংখ্যার বাস্তব এবং কাল্পনিক অংশ হিসাবে ব্যাখ্যা করুন
যেমন (int *) পয়েন্টার = 1048960 + 1i
অক্ষর অ্যারে অক্ষর একটি অ্যারে হিসাবে এটি দেখান
যেমন (char) *c.sp.z = {X}
কাঁচা ! কাঁচা বিন্যাস, কোনো ডেটা টাইপ ভিউ কাস্টমাইজেশন উপেক্ষা করে

নাটভিস

Natvis ফ্রেমওয়ার্ক আপনাকে ভিজ্যুয়াল স্টুডিও যেভাবে ডিবাগার ভেরিয়েবল উইন্ডোতে নেটিভ টাইপ প্রদর্শন করে তা কাস্টমাইজ করতে দেয়। উদাহরণস্বরূপ, ঘড়ি , স্থানীয় এবং ডেটা টিপস উইন্ডোগুলির জন্য প্রদর্শনগুলি কাস্টমাইজ করতে Natvis ব্যবহার করুন।

ন্যাটভিস বৈশিষ্ট্যটি ডিফল্টরূপে সক্রিয় থাকে তবে টুলস > বিকল্প > অ্যান্ড্রয়েড গেম ডেভেলপমেন্ট এক্সটেনশন > ন্যাটভিস পতাকা নিষ্ক্রিয় করে সেট করে ভিজ্যুয়াল স্টুডিও থেকে নিষ্ক্রিয় করা যেতে পারে।

Natvis ফাইল লোড হচ্ছে

ভিজ্যুয়াল স্টুডিও নীচে তালিকাভুক্ত তিনটি অবস্থান থেকে Natvis ফাইলগুলি লোড করে এবং প্রতিবার আপনি যখন একটি ডিবাগিং সেশন শুরু করেন তখন সেগুলি পুনরায় লোড করে৷ ফাইলগুলিকে অবশ্যই ভিজ্যুয়াল স্টুডিও 2017 ন্যাটভিস স্কিমা মেনে চলতে হবে।

  • .natvis ফাইল যা একটি লোড করা প্রকল্প বা শীর্ষ-স্তরের সমাধান আইটেমের অংশ।
  • ব্যবহারকারী-নির্দিষ্ট ডিরেক্টরি ( %USERPROFILE%\Documents\Visual Studio 2017\Visualizers )
  • সিস্টেম-ওয়াইড ডিরেক্টরি ( %VSINSTALLDIR%\Common7\Packages\Debugger\Visualizers )
Natvis ফাইল পুনরায় লোড করা হচ্ছে

কমান্ড উইন্ডো বা ওয়াচ উইন্ডোতে .natvisreload মূল্যায়ন করে একটি ডিবাগ সেশনের সময় Natvis ফাইলগুলি পুনরায় লোড করুন।

ন্যাটভিস ফাইলের নমুনা

এই নমুনা ন্যাটভিস ফাইলটিতে সমস্ত ট্যাগ রয়েছে এবং বৈশিষ্ট্যগুলি বর্তমানে সমর্থিত।

<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">

  <Type Name="demo::Vector&lt;*&gt;">
    <AlternativeType Name="MySimilarVectorType&lt;*&gt;"/>

    <!-- Included to show the <SmartPointer> feature is supported. -->
    <SmartPointer Optional="true" Usage="Minimal">ptr</SmartPointer>

    <!-- Included to show the <DisplayString> feature is supported. -->
    <DisplayString Condition="_size == 0" Optional="true">()</DisplayString>
    <DisplayString Condition="_size == 1">(x={_items[0]})</DisplayString>
    <DisplayString Condition="_size == 2">(x={_items[0]}, y={_items[1]})</DisplayString>
    <DisplayString Condition="_size == 3">(x={_items[0]}, y={_items[1]}, z={_items[2]})</DisplayString>
    <DisplayString>[Size={_size,x}] (x={_items[0]}, y={_items[1]}, z={_items[2]}, ...)</DisplayString>

    <!-- Included to show the <StringView> feature is supported. -->
    <StringView Condition="true" Optional="true">_stringViewText</StringView>

    <Expand HideRawView="false">
      <!-- Included to show the <Item> feature is supported. -->
      <Item Name="X" Condition="_size &lt; 4 &amp;&amp; _size &gt;= 1" Optional="true">_items[0]</Item>
      <Item Name="Y" Condition="_size &lt; 4 &amp;&amp; _size &gt;= 2" Optional="true">_items[1]</Item>
      <Item Name="Z" Condition="_size &lt; 4 &amp;&amp; _size &gt;= 3" Optional="true">_items[2]</Item>

      <!-- Included to show the <ArrayItems> feature is supported. -->
      <ArrayItems Condition="_size >= 4" Optional="true">
        <Size Condition="true" Optional="true">_size</Size>
        <ValuePointer Condition="true">_items</ValuePointer>
      </ArrayItems>

      <!-- Included to show the <IndexListItems> feature is supported. -->
      <IndexListItems Condition="true" Optional="true">
        <Size Condition="true" Optional="true">_listSize</Size>
        <ValueNode Condition="true">_list[%i]</ValueNode>
      </IndexListItems>

      <!-- Included to show the <LinkedListItems> feature is supported. -->
      <LinkedListItems Condition="true" Optional="true">
        <Size Optional="true">_listSize</Size>
        <HeadPointer>_head</HeadPointer>
        <NextPointer>_next</NextPointer>
        <ValueNode>_value</ValueNode>
      </LinkedListItems>

      <!-- Included to show the <ExpandedItem> feature is supported. -->
      <ExpandedItem Condition="true" Optional="true">_childVar</ExpandedItem>

      <!-- Included to show the <Synthetic> feature is supported. -->
      <Synthetic Name="[Size]" Condition="true" Optional="true">
        <DisplayString>_size</DisplayString>
        <Expand HideRawView="true">
          <!-- Any supported <Expand> sub-tags. -->
        </Expand>
      </Synthetic>

      <!-- Included to show the <TreeItems> feature is supported. -->
      <TreeItems Condition="true" Optional="true">
        <Size>_treeSize</Size>
        <HeadPointer>_head</HeadPointer>
        <LeftPointer>_left</LeftPointer>
        <RightPointer>_right</RightPointer>
        <ValueNode>_value</ValueNode>
      </TreeItems>

      <!-- Included to show format specifiers are supported. -->
      <Item Name="[Hex Dump at {_index,x}]">myInt[_index],x</Item>
    </Expand>
  </Type>
</AutoVisualizer>

ন্যাটভিস ফাইল লেখা

ভিজ্যুয়াল স্টুডিও আপনার নিজের ন্যাটভিস ফাইলগুলিকে সমর্থন করে। ডিবাগার ভেরিয়েবল উইন্ডো কাস্টমাইজ করার বিষয়ে আরও তথ্যের জন্য, MSDN দেখুন।

নাটভিস ফাইল ডিবাগ করা

কিছু ক্ষেত্রে ত্রুটিগুলি একটি ভেরিয়েবলের মান হিসাবে উপস্থাপিত হবে (যেমন Auto , Watch , ইত্যাদি উইন্ডোতে)। উদাহরণস্বরূপ: <error: use of undeclared identifier 'missingVar'>

আপনি অ্যান্ড্রয়েড গেম ডেভেলপমেন্ট এক্সটেনশন টুলবার থেকে GoogleAndroid.log ফাইলটি খোলার মাধ্যমে ত্রুটি সম্পর্কে আরও বিশদ অ্যাক্সেস করতে পারেন।

পরিচিত সীমাবদ্ধতা

  • আপনার ট্যাগ বা বৈশিষ্ট্য উপরের উদাহরণ ফাইলে তালিকাভুক্ত না থাকলে, এটি বর্তমানে সমর্থিত নয়। ভিজ্যুয়াল স্টুডিও অসমর্থিত ট্যাগ এবং বৈশিষ্ট্যগুলিকে উপেক্ষা করে, তাই আপনি সেগুলিকে একটি বিদ্যমান Natvis ফাইলে রেখে যেতে পারেন এবং ফাইলটি কাজ করবে, যতক্ষণ না এটি আমাদের স্কিমা ব্যবহার করে।

  • Usage বৈশিষ্ট্য, স্কিমা দ্বারা প্রয়োজনীয় যদিও, <SmartPointer> এর জন্য সমর্থিত নয়। যাইহোক, LLDB C++-এ সংজ্ঞায়িত অপারেটরগুলিতে অ্যাক্সেস সীমাবদ্ধ করে না, যাতে যেকোনো প্রয়োজনীয় অপারেটরকে C++-এ সংজ্ঞায়িত করা যায়।