डीबगर

विज़ुअल स्टूडियो डीबगर (एलएलडीबी) की मदद से अपने प्रोजेक्ट को डीबग करने के लिए Android गेम डेवलपमेंट एक्सटेंशन.

डीबगर चलाएं

डीबगर चलाने से पहले, आपको अपने Android पर एक गेम खेलें. ज़्यादा जानकारी के लिए, सैंपल चलाएं सेक्शन देखें.

यह पक्का करने के बाद कि आप डीबगर के बिना अपना गेम चला सकते हैं, आप डीबगर को F5 दबाकर या डीबग करना शुरू करें आइटम चुनकर करें को डीबग मेन्यू में जाकर सबमिट करें. डीबगर अटैच होते समय आपको एक डायलॉग दिखेगा गेम से जुड़े रहें.

डीबगर को लॉन्च होने में 10 सेकंड से 1 मिनट या उससे ज़्यादा समय लगता है आपके ऐप्लिकेशन के साइज़ और ज़रूरी सिंबल की संख्या के हिसाब से पर लोड होने की अनुमति नहीं है. नए डिवाइस से अटैच करने में ज़्यादा समय लगता है जब डीबगर को डिवाइस को होस्ट मशीन से लिंक करना. अगर पहली बार में एक मिनट से ज़्यादा समय लग रहा है, तो नए डिवाइस का इस्तेमाल करने की कुछ बार कोशिश की जाती है. डीबग सेशन को रद्द करने पर विचार करें और फिर इसे रीस्टार्ट कर रहा है.

जब आप डीबगर को इस तरह रन करते हैं, तो गेम डीबगर मोड चालू कर देता है और यह आपके गेम के किसी भी कोड को तब तक एक्ज़ीक्यूट नहीं करेगा, जब तक डीबगर कनेक्ट होता है. इसकी मदद से, 'इनीशियलाइज़ेशन सेक्शन' को भी डीबग किया जा सकता है आपका गेम.

विज़ुअल स्टूडियो डीबगर की खास सुविधाओं के बारे में ज़्यादा जानकारी पाने के लिए, यहां जाएं: Visual Studio के दस्तावेज़ पढ़े जा रहे हैं.

किसी प्रोसेस में अटैच करना

अगर आपको किसी ऐसे गेम को डीबग करना है जो पहले से फ़िज़िकल या वर्चुअल पर चल रहा है डिवाइस का इस्तेमाल करके, डीबगर को इस प्रोसेस में अटैच किया जा सकता है.

पक्का करें कि विज़ुअल स्टूडियो में Android समाधान खुला हो और:

  1. डीबग मेन्यू पर जाएं और प्रोसेस से अटैच करें... चुनें.
  2. परिवहन ड्रॉपडाउन से, Android गेम डेवलपमेंट एक्सटेंशन चुनें.
  3. क्वालिफ़ायर ड्रॉपडाउन से अपना Android डिवाइस चुनें.
  4. उपलब्ध प्रोसेस की सूची में से गेम की प्रोसेस चुनें और अटैच करें पर क्लिक करें.

प्रोसेस में अटैच करें

LLDB.Shell के निर्देश एक्ज़ीक्यूट किए जा रहे हैं

डीबग सेशन चालू होने पर, इसे चलाने के लिए Visual Studio की कमांड विंडो का इस्तेमाल करें LLDB.Shell के निर्देश.

कमांड फ़ॉर्मैट:

LLDB.Shell [command]

उदाहरण:

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

डेटा विज़ुअलाइज़ेशन

फ़ॉर्मैट की खास जानकारी देने वाले

Autos में वैल्यू के दिखने का फ़ॉर्मैट बदला जा सकता है, फ़ॉर्मैट की खास जानकारी देने वाले टूल का इस्तेमाल करके, लोकल, वॉच, और वैरिएबल DataTip विंडो.

फ़ॉर्मैट की खास जानकारी देने वाले टूल, एक्सप्रेशन के आखिर में होते हैं. वे कॉमा से शुरू होते हैं फिर एक छोटी स्ट्रिंग हो. उदाहरण के लिए, _myInt,x में ,x की खास जानकारी एक्सप्रेशन myInt को लोअरकेस हेक्साडेसिमल के तौर पर फ़ॉर्मैट करेगा.

फ़ॉर्मैट की खास जानकारी देने वाली सुविधाओं का इस्तेमाल, सीधे Watch विंडो में या Autos, Locals, और DataTip विंडो को अपने Natvis में जोड़कर एक्सप्रेशन के बारे में भी बताया गया है. ज़्यादा जानकारी के लिए Natvis देखें.

सहायता स्पेसिफ़िकेशन की सूची

फ़ॉर्मैट का नाम जानकारी देने वाले ब्यौरा
बूलियन B इसे एक सही/गलत बूलियन के रूप में दिखाएं. इसके लिए, आम तौर पर इस्तेमाल किए जाने वाले ऐसे नियम का इस्तेमाल करें जिसमें 0 गलत है और बाकी सब कुछ सही है
बाइनरी b इसे बिट के क्रम के रूप में दिखाएं
बाइनरी, आगे 0b नहीं बीबी इसे बिट के क्रम के तौर पर बिना 0b प्रीफ़िक्स के दिखाएं
बाइट y बाइट दिखाएं, लेकिन उन्हें ASCII वर्ण के रूप में दिखाने की कोशिश करें
उदाहरण के लिए, (int *) c.sp.x = 50 f8 bf 5f 7f 00 00 P.._....
ASCII वाले बाइट Y बाइट दिखाएं, लेकिन उन्हें ASCII वर्ण के रूप में दिखाने की कोशिश करें
उदाहरण के लिए, (int *) c.sp.x = 50 f8 bf 5f 7f 00 00 P.._....
वर्ण c बाइट को ASCII वर्णों के तौर पर दिखाएं
उदाहरण के लिए, (int *) c.sp.x = P\xf8\xbf_\xff\x7f\0\0
प्रिंट हो सकने वाला वर्ण C बाइट को प्रिंट हो सकने वाले ASCII वर्णों के तौर पर दिखाएं
उदाहरण (int *) c.sp.x = P.._....
कॉम्प्लेक्स फ़्लोट F इस वैल्यू को किसी कॉम्प्लेक्स फ़्लोटिंग-पॉइंट नंबर का असली और काल्पनिक हिस्सा मानें
उदाहरण (int *) c.sp.x = 2.76658e+19 + 4.59163e-41i
दशमलव अंग्रेज़ी के छोटे अक्षर "d" के ऊपर बना खास निशान, आई इसे एक साइन किए गए पूर्णांक संख्या के रूप में दिखाएं (यह कोई कास्ट नहीं करता, यह सिर्फ़ साइन के साथ पूर्णांक के रूप में बाइट दिखाता है)
गिनती अंग्रेज़ी इसे एन्युमरेशन के तौर पर दिखाएं. अगर वैल्यू उपलब्ध हो, तो इसका नाम प्रिंट करें या पूर्णांक वैल्यू को प्रिंट करें
उदाहरण के लिए, (enum enumType) val_type = eValue2
हेक्साडेसिमल - स्मॉलकेस x, घं॰ इसे लोअरकेस हेक्साडेसिमल नोटेशन में दिखाएं (यह कोई कास्ट नहीं करता, यह सिर्फ़ बाइट को हेक्स के रूप में दिखाता है)
हेक्साडेसिमल - अपरकेस एक्स, एच इसे अपरकेस हेक्साडेसिमल नोटेशन में दिखाएं (यह कोई कास्ट नहीं करता, यह सिर्फ़ बाइट को हेक्स के रूप में दिखाता है)
हेक्साडेसिमल - स्मॉलकेस, कोई भी शुरू में 0x नहीं एक्सबी, एचबी इसे 0x प्रीफ़िक्स के बिना लोअरकेस हेक्साडेसिमल नोटेशन में दिखाएं (यह कोई कास्ट नहीं करता, यह सिर्फ़ बाइट को हेक्स के रूप में दिखाता है)
हेक्साडेसिमल - अपरकेस, कोई शुरू में 0x नहीं एक्सबी, एचबी इसे 0x प्रीफ़िक्स के बिना अपरकेस हेक्साडेसिमल नोटेशन में दिखाएं (यह कोई कास्ट नहीं करता, यह सिर्फ़ बाइट को हेक्स के रूप में दिखाता है)
फ़्लोट f इसे फ़्लोटिंग-पॉइंट नंबर के तौर पर दिखाएं (यह कोई कास्ट नहीं करता. यह बाइट को IEEE754 की फ़्लोटिंग-पॉइंट वैल्यू के तौर पर समझता है)
ऑक्टल o इसे ऑक्टल संकेतन में दिखाएं
ओएस का टाइप O इसे MacOS OSType के रूप में दिखाएं
उदा. (फ़्लोट) x = '\n\x1f\xd7\n'
स्ट्रिंग - C-स्ट्रिंग s इसे 0-खत्म की गई C स्ट्रिंग के तौर पर दिखाएं
उदाहरण "हैलो वर्ल्ड"
स्ट्रिंग - C-स्ट्रिंग, कोई कोटेशन मार्क नहीं sb इसे कोटेशन मार्क के बिना, 0-खत्म की गई C स्ट्रिंग के तौर पर दिखाएं,
उदाहरण के लिए, हैलो वर्ल्ड
स्ट्रिंग - UTF-8 एस8 इसे 0-खत्म की गई UTF-8 स्ट्रिंग के तौर पर दिखाएं
उदाहरण u8"हैलो वर्ल्ड ☕"
स्ट्रिंग - UTF-8, कोई कोटेशन मार्क नहीं एस8बी इसे कोटेशन मार्क के बिना, 0 खत्म की गई UTF-8 स्ट्रिंग के तौर पर दिखाएं
उदाहरण के लिए, हैलो वर्ल्ड ☕
स्ट्रिंग - UTF-16 सू इसे 0-खत्म की गई UTF-16 स्ट्रिंग के तौर पर दिखाएं
उदाहरण उ"हैलो वर्ल्ड ☕"
स्ट्रिंग - UTF-16, कोई उद्धरण चिह्न नहीं sub इसे कोटेशन मार्क के बिना, 0 खत्म की गई UTF-16 स्ट्रिंग के तौर पर दिखाएं
उदाहरण के लिए, हैलो वर्ल्ड ☕
स्ट्रिंग - UTF-32 एस32 इसे 0-खत्म की गई UTF-32 स्ट्रिंग के तौर पर दिखाएं
उदाहरण उ"हैलो वर्ल्ड ☕"
स्ट्रिंग - UTF-32, कोई उद्धरण चिह्न नहीं एस32बी इसे कोटेशन मार्क के बिना, 0 खत्म की गई UTF-32 स्ट्रिंग के तौर पर दिखाएं
उदाहरण के लिए, हैलो वर्ल्ड ☕
यूनिकोड16 U इसे UTF-16 वर्णों के रूप में दिखाएं
उदा. (फ़्लोट) x = 0xd70a 0x411f
यूनिकोड32 U32 इसे UTF-32 वर्णों के रूप में दिखाएं
उदा. (फ़्लोट) x = 0x411fd70a
बिना हस्ताक्षर वाला दशमलव u इसे बिना साइन वाले पूर्णांक के तौर पर दिखाएं (यह कोई कास्ट नहीं करता, यह सिर्फ़ बाइट को साइन नहीं किए गए पूर्णांक के तौर पर दिखाता है)
पॉइंटर p इसे नेटिव पॉइंटर के रूप में दिखाएं (जब तक कि यह वाकई में पॉइंटर न हो, तब तक मिलने वाला पता शायद अमान्य होगा)
कॉम्प्लेक्स इंटीजर I इस वैल्यू को किसी कॉम्प्लेक्स पूर्णांक संख्या के असली और काल्पनिक हिस्से के तौर पर समझें
उदाहरण के लिए, (int *) पॉइंटर = 1048960 + 1i
कैरेक्टर अरे a इसे वर्णों की कैटगरी के तौर पर दिखाएं
उदाहरण (वर्ण) *c.sp.z = {X}
Raw ! रॉ फ़ॉर्मैट, जिसमें डेटा टाइप व्यू को पसंद के मुताबिक बनाने की सुविधा को अनदेखा किया जाता है

नैटविस

Natvis फ़्रेमवर्क आपको विज़ुअल स्टूडियो को दिखाने के तरीके को कस्टमाइज़ करने देता है डीबगर वैरिएबल विंडो में नेटिव टाइप का इस्तेमाल करके. उदाहरण के लिए, Natvis का इस्तेमाल करके डिसप्ले को वॉच, लोकल, और डेटा से जुड़ी सलाह विंडो के लिए, पसंद के मुताबिक बनाने की सुविधा मिलती है.

Natvis सुविधा डिफ़ॉल्ट रूप से चालू होती है, लेकिन इसे विज़ुअल स्टूडियो से बंद किया जा सकता है इसके लिए, टूल > विकल्प > Android गेम डेवलपमेंट एक्सटेंशन > नैटविस बंद पर फ़्लैग करें.

Natvis फ़ाइलें लोड हो रही हैं

विज़ुअल स्टूडियो, नीचे दी गई तीन जगहों से Natvis फ़ाइलें लोड करता है और हर बार डीबग करने का सेशन शुरू करने पर, इन्हें फिर से लोड करता है. फ़ाइलों को विज़ुअल स्टूडियो 2017 Natvis स्कीमा.

  • .natvis फ़ाइलें, जो किसी लोड किए गए प्रोजेक्ट या टॉप लेवल समाधान आइटम का हिस्सा हैं.
  • उपयोगकर्ता के हिसाब से डायरेक्ट्री %USERPROFILE%\Documents\Visual Studio 2017\Visualizers
  • पूरे सिस्टम की डायरेक्ट्री %VSINSTALLDIR%\Common7\Packages\Debugger\Visualizers
Natvis फ़ाइलें फिर से लोड हो रही है

डीबग सेशन के दौरान, Natvis फ़ाइलों को फिर से लोड करने के लिए.natvisreload निर्देश विंडो या स्मार्टवॉच की विंडो.

Natvis फ़ाइल का नमूना

इस नमूना 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>

Natvis फ़ाइलें लिखी जा रही हैं

विज़ुअल स्टूडियो अपनी खुद की Natvis फ़ाइलें बनाने की सुविधा देता है. Reader Revenue Manager को सेट अप करने के बारे में डीबगर वैरिएबल विंडो को पसंद के मुताबिक बनाने के बारे में जानने के लिए, देखें एमएसडीएन.

Natvis फ़ाइलों को डीबग करना

कुछ मामलों में, गड़बड़ियों को वैरिएबल की वैल्यू के रूप में दिखाया जाएगा (उदाहरण के लिए, Auto, Watch वगैरह विंडो). उदाहरण के लिए: <error: use of undeclared identifier 'missingVar'>

GoogleAndroid.log को खोलकर, गड़बड़ी के बारे में ज़्यादा जानकारी देखी जा सकती है Android गेम डेवलपमेंट एक्सटेंशन टूलबार से ली गई फ़ाइल खोलें.

सीमाएं

  • अगर आपका टैग या एट्रिब्यूट ऊपर दी गई उदाहरण फ़ाइल में नहीं है, तो ऐसा नहीं है फ़िलहाल काम करता है. Visual Studio काम न करने वाले टैग और एट्रिब्यूट को अनदेखा करता है, इसलिए तो आप उन्हें किसी मौजूदा Natvis फ़ाइल में छोड़ सकते है और फ़ाइल तब तक काम करेगी, जब तक यह हमारे स्कीमा का इस्तेमाल करता है.

  • हालांकि, स्कीमा के लिए ज़रूरी Usage एट्रिब्यूट इसके साथ काम नहीं करता <SmartPointer>. हालांकि, एलएलडीबी, ऑपरेटर के ऐक्सेस पर पाबंदी नहीं लगाता है C++ में तय किया गया है, ताकि किसी भी ज़रूरी ऑपरेटर को C++ में परिभाषित किया जा सके.