ऐड्रेस सैनिटाइज़र का इस्तेमाल करके, मेमोरी के गड़बड़ी को डीबग करना

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

HWAddress सैनिटाइज़र और अड्रेस सैनिटाइज़र

HWAddress सैनिटाइज़र (HWASan) और पता सैनिटाइज़र (ASan), मेमोरी को खराब करने वाले टूल को डीबग करने में मदद करता है यह मेमोरी के खराब होने को डीबग करने और गड़बड़ियों को ओवरराइट करने में मदद करती है, जैसे कि फ़ॉलो किया जा रहा है:

  • स्टैक बफ़र का ओवरफ़्लो और अंडरफ़्लो
  • हीप बफ़र का ओवरफ़्लो और अंडरफ़्लो
  • स्टैक इस्तेमाल को इसके दायरे से बाहर रखें
  • डबल फ़्री और वाइल्ड फ़्री गड़बड़ियां
  • रिटर्न के बाद स्टैक का इस्तेमाल (सिर्फ़ HWASan)

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

रनटाइम बिहेवियर

चालू होने पर, HWASan और ASan, दोनों के डिवाइस में मेमोरी खराब होने की जांच अपने-आप हो जाती है आपके ऐप्लिकेशन के पूरे रनटाइम के लिए.

अगर मेमोरी से जुड़ी किसी गड़बड़ी का पता चलता है, तो ऐप्लिकेशन, SIGBART (सिग्नल रद्द करने की सुविधा) के साथ क्रैश हो जाता है और Logcat में पूरी जानकारी वाला मैसेज प्रिंट कर देता है. मैसेज की एक कॉपी भी /data/tombstones के तहत फ़ाइल में लिखा गया है.

गड़बड़ी का मैसेज कुछ ऐसा दिखता है:

ERROR: HWAddressSanitizer: tag-mismatch on address 0x0042a0826510 at pc 0x007b24d90a0c
WRITE of size 1 at 0x0042a0826510 tags: 32/3d (ptr/mem) in thread T0
    #0 0x7b24d90a08  (/data/app/com.example.hellohwasan-eRpO2UhYylZaW0P_E0z7vA==/lib/arm64/libnative-lib.so+0x2a08)
    #1 0x7b8f1e4ccc  (/apex/com.android.art/lib64/libart.so+0x198ccc)
    #2 0x7b8f1db364  (/apex/com.android.art/lib64/libart.so+0x18f364)
    #3 0x7b8f2ad8d4  (/apex/com.android.art/lib64/libart.so+0x2618d4)

0x0042a0826510 is located 0 bytes to the right of 16-byte region [0x0042a0826500,0x0042a0826510)
allocated here:
    #0 0x7b92a322bc  (/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so+0x212bc)
    #1 0x7b24d909e0  (/data/app/com.example.hellohwasan-eRpO2UhYylZaW0P_E0z7vA==/lib/arm64/libnative-lib.so+0x29e0)
    #2 0x7b8f1e4ccc  (/apex/com.android.art/lib64/libart.so+0x198ccc)

ज़रूरी शर्तें

Android OS का HWASan बिल्ड इंस्टॉल करें

HWASan का इस्तेमाल करने के लिए, इसमें दिए गए सेटअप निर्देशों का पालन करें: Google के लिए Android OS का HWASan बिल्ड इंस्टॉल करने के लिए HWASan दस्तावेज़ Pixel डिवाइस.

अन्य डिवाइसों के लिए, HWASan बिल्ड पाने के लिए, अपने मैन्युफ़ैक्चरर से संपर्क करें ओएस का इस्तेमाल करें, अगर उपलब्ध हो या सिर्फ़ सॉफ़्टवेयर वाले ASan टूल का इस्तेमाल करें.

अपने प्रोजेक्ट में शेयर की गई C++ स्टैंडर्ड लाइब्रेरी का इस्तेमाल करना

एक ज्ञात समस्या के कारण, जब ASan libc++_static का इस्तेमाल करके. libc++_shared का इस्तेमाल करते समय यह समस्या नहीं दिखती है.

HWASan के ऑपरेटर, new और delete को लागू करने की सुविधा मिलती है. यह ये काम नहीं कर सकता का इस्तेमाल तब किया जाना चाहिए, जब स्टैंडर्ड लाइब्रेरी प्रोजेक्ट से स्टैटिक रूप से लिंक की गई हो.

इस सेटिंग को बदलने के लिए, C++ स्टैंडर्ड लाइब्रेरी को लिंक करना लेख देखें सेक्शन में जोड़ा जा सकता है.

फ़्रेम पॉइंटर जनरेट करने की सुविधा चालू करें

HWASan और ASan, स्टैक ट्रेस को जनरेट करने के लिए, तेज़ फ़्रेम वाले पॉइंटर पर आधारित अनविंडर का इस्तेमाल करते हैं मेमोरी के बंटवारे और डील करने की जगह से जुड़े इवेंट की जानकारी. इसका मतलब है कि इन चीज़ों का इस्तेमाल करने के लिए, C++ कंपाइलर सेटिंग में फ़्रेम पॉइंटर जनरेट करने की सुविधा चालू करनी होगी सुविधाएँ. इसका मतलब है कि आपको फ़्रेम पॉइंटर हटाने की सुविधा को बंद करना होगा.

इस सेटिंग को बदलने के लिए, फ़्रेम पॉइंटर चालू करना देखें जेनरेशन सेक्शन में सबमिट करें.

HWASan या ASan का इस्तेमाल करने के लिए, अपने Visual Studio प्रोजेक्ट को कॉन्फ़िगर करना

HWASan या ASan को चालू करना

HWASan या ASan को चालू करने के लिए, कॉन्फ़िगरेशन प्रॉपर्टीज़ > पर जाएं सामान्य अपने प्रोजेक्ट के लिए प्रॉपर्टी पेज.

मौजूदा रिपोर्ट के लिए, Visual Studio सलूशन एक्सप्लोरर प्रॉपर्टी मेन्यू
प्रोजेक्ट.

पहली इमेज: विज़ुअल स्टूडियो सलूशन में, प्रोजेक्ट के प्रॉपर्टी विकल्प एक्सप्लोरर विंडो.

प्रोजेक्ट प्रॉपर्टी पेजों का डायलॉग बॉक्स, जिसमें सामान्य प्रॉपर्टी दिख रही हैं और पता
सैनिटाइज़र सेटिंग हाइलाइट की गई.

दूसरी इमेज: सामान्य प्रोजेक्ट में Address Sanitizer (ASan) सेटिंग प्रॉपर्टी.

अपने प्रोजेक्ट के लिए HWASan को चालू करने के लिए, Address Sanitizer (ASan) को बदलें इस पर सेट कर रहा है Hardware ASan Enabled (fsanitize=hwaddress).

अपने प्रोजेक्ट के लिए ASan को चालू करने के लिए, Address Sanitizer (ASan) सेटिंग बदलें ASan सक्षम (fsanitize=address) तक.

फ़्रेम पॉइंटर जनरेट करने की सुविधा चालू करना

फ़्रेम पॉइंटर जेनरेशन को Omit Frame Pointer C/C++ से कंट्रोल किया जाता है कंपाइलर सेटिंग और इसे आपके प्रोजेक्ट के प्रॉपर्टी पेज में देखा जा सकता है कॉन्फ़िगरेशन प्रॉपर्टी > C/C++ > ऑप्टिमाइज़ेशन.

C/C++ ऑप्टिमाइज़ेशन प्रॉपर्टी के साथ, प्रोजेक्ट प्रॉपर्टी पेजों का डायलॉग दिखाया गया है,
और फ़्रेम पॉइंटर की सेटिंग हटाएं
हाइलाइट किया जाएगा.

तीसरी इमेज: फ़्रेम पॉइंटर छोड़ें सेटिंग कहां मिलेगी.

HWASan या ASan का इस्तेमाल करते समय, Omit Frame Pointer की सेटिंग को नहीं (-fno-omit-frame-pointer).

C++ स्टैंडर्ड लाइब्रेरी को शेयर की गई लाइब्रेरी मोड में लिंक करना

C++ स्टैंडर्ड लाइब्रेरी के लिए लिंकर मोड सेटिंग यहां देखें: प्रोजेक्ट के प्रॉपर्टी पेज में, कॉन्फ़िगरेशन प्रॉपर्टी > सामान्य, प्रोजेक्ट डिफ़ॉल्ट सेक्शन में.

चुनी गई सामान्य कैटगरी के साथ प्रोजेक्ट प्रॉपर्टी पेज डायलॉग और
एसटीएल सेटिंग का इस्तेमाल
हाइलाइट किया जाएगा.

चौथी इमेज: C++ स्टैंडर्ड लाइब्रेरी के लिए लिंकर मोड की सेटिंग कहां मिलेगी.

HWASan या ASan का इस्तेमाल करते समय, सेट करें C++ स्टैंडर्ड लाइब्रेरी (.so) का इस्तेमाल करने के लिए, एसटीएल का इस्तेमाल. यह मान C++ को लिंक करता है स्टैंडर्ड लाइब्रेरी को शेयर की गई लाइब्रेरी के तौर पर अपलोड करें, जो इन कामों के लिए ज़रूरी है सही तरीके से काम करने के लिए HWASan और ASan.

पता सैनिटाइज़र के इस्तेमाल के लिए बिल्ड कॉन्फ़िगरेशन बनाना

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

हालांकि, अगर आपको यह काम का लगता है और नियमित तौर पर इसका इस्तेमाल करना है, तो ऐसा किया जा सकता है HWASan या ASan के लिए नया बिल्ड कॉन्फ़िगरेशन बनाना, जैसा कि चायदानी का नमूना. ऐसा तब किया जा सकता है, जब, उदाहरण के लिए, यूनिट की जांच के दौरान या रात भर में आपके गेम का स्मोक टेस्ट करता है.

एक अलग बिल्ड कॉन्फ़िगरेशन बनाना, खास तौर पर तब मददगार हो सकता है, जब आपके पास एक बड़ा प्रोजेक्ट जो तीसरे पक्ष की अलग-अलग लाइब्रेरी की बड़ी संख्या का इस्तेमाल करता है जहां आम तौर पर, C++ स्टैंडर्ड लाइब्रेरी को स्टैटिक रूप से लिंक किया जाता है. खास तौर पर बनाया गया बिल्ड कॉन्फ़िगरेशन से यह पक्का करने में मदद मिलती है कि आपके प्रोजेक्ट की सेटिंग पहले की तरह ही बनी रहें हमेशा सटीक रहेगा.

बिल्ड कॉन्फ़िगरेशन बनाने के लिए, अपने प्रोजेक्ट के प्रॉपर्टी पेज में जाकर, यह कॉन्फ़िगरेशन मैनेजर... बटन चालू करें, और फिर सक्रिय समाधान कॉन्फ़िगरेशन ड्रॉप-डाउन. फिर चुनें , और एक सही नाम के साथ नया बिल्ड कॉन्फ़िगरेशन बनाएं (उदाहरण के लिए, HWASan चालू है).