HWASan रिपोर्ट को समझना

जब HWASan टूल मेमोरी बग का पता लगाता है, तो प्रक्रिया abort() के साथ समाप्त हो जाती है, और एक रिपोर्ट stderr और logcat पर प्रिंट हो जाती है। एंड्रॉइड पर सभी मूल क्रैश की तरह, HWASan त्रुटियां /data/tombstones के अंतर्गत पाई जा सकती हैं।

नियमित देशी क्रैश की तुलना में, HWASan समाधि स्थल के शीर्ष के पास "संदेश निरस्त करें" फ़ील्ड में अतिरिक्त जानकारी रखता है। नीचे एक नमूना ढेर-आधारित क्रैश देखें (स्टैक बग के लिए, स्टैक-विशिष्ट अनुभागों के लिए नीचे नोट देखें)।

उदाहरण रिपोर्ट

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'google/flame_hwasan/flame:Tiramisu/MASTER/7956676:userdebug/dev-keys'
Revision: 'DVT1.0'
ABI: 'arm64'
Timestamp: 2019-04-24 01:13:22+0000
pid: 11154, tid: 11154, name: sensors@1.0-ser  >>> /vendor/bin/hw/android.hardware.sensors@1.0-service <<<
signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr --------
Abort message: '

[...]

[0x00433ae20040,0x00433ae20060) is a small unallocated heap chunk; size: 32 offset: 5








[ … regular crash dump follows …]

यह एड्रेससेनिटाइज़र रिपोर्ट के समान है। उनके विपरीत, लगभग सभी HWASan बग "टैग-मिसमैच" हैं, यानी एक मेमोरी एक्सेस जहां एक पॉइंटर टैग संबंधित मेमोरी टैग से मेल नहीं खाता है। यह इनमें से एक हो सकता है

  • स्टैक या ढेर पर सीमा से बाहर पहुंच
  • ढेर पर मुफ़्त के बाद उपयोग करें
  • स्टैक पर वापसी के बाद उपयोग करें

धारा

HWASan रिपोर्ट के प्रत्येक अनुभाग का स्पष्टीकरण नीचे दिया गया है:

प्रवेश त्रुटि

इसमें खराब मेमोरी एक्सेस के बारे में जानकारी शामिल है, जिसमें शामिल हैं:

  • एक्सेस प्रकार ("पढ़ें" बनाम "लिखें")
  • पहुंच का आकार (कितने बाइट्स तक पहुंचने का प्रयास किया गया)
  • पहुंच का थ्रेड नंबर
  • पॉइंटर और मेमोरी टैग (उन्नत डिबगिंग के लिए)

एक्सेस स्टैक ट्रेस

ख़राब मेमोरी एक्सेस का स्टैक ट्रेस। प्रतीक करने के लिए प्रतीकीकरण अनुभाग देखें।

कारण

ख़राब पहुंच का संभावित कारण. यदि कई उम्मीदवार हैं, तो उन्हें घटती संभावना के क्रम में सूचीबद्ध किया गया है। संभावित कारण के बारे में विस्तृत जानकारी से पहले। HWASan निम्नलिखित कारणों का निदान कर सकता है:

  • का उपयोग के बाद नि: शुल्क
  • स्टैक टैग-बेमेल: यह स्टैक उपयोग-बाद-वापसी / उपयोग के बाद-दायरे, या सीमा से बाहर हो सकता है
  • ढेर-बफर-अतिप्रवाह
  • वैश्विक-अतिप्रवाह

स्मृति सूचना

यह बताता है कि HWASan एक्सेस की जा रही मेमोरी के बारे में क्या जानता है, और बग प्रकार के आधार पर भिन्न हो सकता है।

बग प्रकार कारण रिपोर्ट प्रारूप
टैग-बेमेल का उपयोग के बाद नि: शुल्क
<address> is located N bytes inside of M-byte region [<start>, <end>)
  freed by thread T0 here:
ढेर-बफर-अतिप्रवाह ध्यान दें कि यह अंडरफ़्लो भी हो सकता है.
<address> is located N bytes to the right of M-byte region [<start>, <end>)
  allocated here:
स्टैक टैग-बेमेल स्टैक रिपोर्ट ओवरफ़्लो/अंडरफ़्लो और उपयोग-बाद-रिटर्न बग के बीच अंतर नहीं करती है। इसके अलावा, स्टैक आवंटन जो कि त्रुटि का स्रोत है, को खोजने के लिए एक ऑफ़लाइन प्रतीकीकरण चरण की आवश्यकता होती है। नीचे स्टैक रिपोर्ट को समझना अनुभाग देखें।
अमान्य-मुक्त का उपयोग के बाद नि: शुल्क यह एक डबल फ्री बग है. यदि प्रक्रिया बंद होने पर ऐसा होता है, तो यह ओडीआर उल्लंघन का संकेत दे सकता है।
<address> is located N bytes inside of M-byte region [<start>, <end>)
  freed by thread T0 here:
पते का वर्णन नहीं कर सकता या तो एक वाइल्ड फ्री (मेमोरी से मुक्त जिसे पहले आवंटित नहीं किया गया था), या आवंटित मेमोरी को HWASan के फ्री बफर से बाहर निकालने के बाद एक डबल फ्री।
0x... HWAsan शैडो मेमोरी है। यह निश्चित रूप से एक बेतहाशा मुफ़्त है, क्योंकि एप्लिकेशन HWASan की आंतरिक मेमोरी को मुक्त करने का प्रयास कर रहा था।

डीललोकेशन स्टैक ट्रेस

उस स्थान का स्टैक ट्रेस जहां मेमोरी को हटाया गया था। केवल उपयोग के बाद-मुक्त या अमान्य-मुक्त बग के लिए मौजूद है। प्रतीक करने के लिए प्रतीकीकरण अनुभाग देखें।

आवंटन स्टैक ट्रेस

उस स्थान का स्टैक ट्रेस जहां मेमोरी आवंटित की गई थी। प्रतीक करने के लिए प्रतीकीकरण अनुभाग देखें।

उन्नत डिबगिंग जानकारी

HWASan रिपोर्ट में कुछ उन्नत डिबगिंग जानकारी भी शामिल है, जिसमें (क्रमानुसार):

  1. प्रक्रिया में धागों की सूची
  2. प्रक्रिया में धागों की सूची
  3. दोषपूर्ण मेमोरी के पास मेमोरी टैग का मान
  4. मेमोरी एक्सेस के बिंदु पर रजिस्टरों का डंप

मेमोरी टैग डंप

टैग मेमोरी डंप का उपयोग पॉइंटर टैग के समान टैग के साथ आस-पास के मेमोरी आवंटन को देखने के लिए किया जा सकता है। ये बड़े ऑफसेट के साथ सीमा से बाहर पहुंच की ओर इशारा कर सकते हैं। एक टैग 16 बाइट्स मेमोरी से मेल खाता है; पॉइंटर टैग पते के शीर्ष 8 बिट हैं। टैग मेमोरी डंप संकेत दे सकता है, उदाहरण के लिए निम्नलिखित दाईं ओर एक बफर ओवरफ़्लो है:

tags: ad/5c (ptr/mem)
[...]
Memory tags around the buggy address (one tag corresponds to 16 bytes):
  0x006f33ae1ff0: 0e  0e  0e  57  20  20  20  20  20  2e  5e  5e  5e  5e  5e  b5
=>0x006f33ae2000: f6  f6  f6  f6  f6  4c  ad  ad  ad  ad  ad  ad [5c] 5c  5c  5c
  0x006f33ae2010: 5c  04  2e  2e  2e  2e  2e  2f  66  66  66  66  66  80  6a  6a
Tags for short granules around the buggy address (one tag corresponds to 16 bytes):
  0x006f33ae1ff0: ab  52  eb  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..
=>0x006f33ae2000: ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  .. [..] ..  ..  ..
  0x006f33ae2010: ..  5c  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..
(बाईं ओर "विज्ञापन" टैग के 6 × 16 = 96 बाइट्स के रन पर ध्यान दें जो पॉइंटर टैग से मेल खाते हैं)।

यदि आवंटन का आकार 16 का गुणक नहीं है, तो शेष आकार को मेमोरी टैग के रूप में संग्रहीत किया जाएगा और टैग को छोटे ग्रेन्युल टैग के रूप में संग्रहीत किया जाएगा। उपरोक्त उदाहरण में बोल्ड आवंटन टैग वाले विज्ञापन के ठीक बाद, हमारे पास टैग 5सी का 5 × 16 + 4 = 84 बाइट आवंटन है।

एक शून्य मेमोरी टैग (उदा. tags: ad/ 00 (ptr/mem) ) आमतौर पर स्टैक-यूज़-आफ्टर-रिटर्न बग को इंगित करता है।

रजिस्टर डंप

HWASan रिपोर्ट में रजिस्टर डंप उस वास्तविक निर्देश से मेल खाता है जिसने अमान्य मेमोरी एक्सेस निष्पादित किया था। इसके बाद नियमित एंड्रॉइड सिग्नल हैंडलर से एक और रजिस्टर डंप आता है - दूसरे को अनदेखा करें , इसे तब लिया जाता है जब HWASan ने abort() कहा है और यह बग के लिए प्रासंगिक नहीं है।

प्रतीकीकरण

स्टैक ट्रेस में फ़ंक्शन नाम और लाइन नंबर प्राप्त करने के लिए (और उपयोग-बाद-स्कोप बग के लिए परिवर्तनीय नाम प्राप्त करने के लिए), एक ऑफ़लाइन प्रतीकीकरण चरण की आवश्यकता है।

पहली बार सेटअप: एलएलवीएम-सिम्बोलाइज़र स्थापित करें

प्रतीक के रूप में, आपके सिस्टम में llvm-symbolizer स्थापित होना चाहिए और $PATH से एक्सेस किया जाना चाहिए। डेबियन पर, आप इसे sudo apt install llvm उपयोग करके इंस्टॉल कर सकते हैं।

प्रतीक फ़ाइलें प्राप्त करें

प्रतीकीकरण के लिए, हमें प्रतीकों वाले अनस्ट्रिप्ड बायनेरिज़ की आवश्यकता होती है। ये कहां पाए जा सकते हैं यह निर्माण के प्रकार पर निर्भर करता है:

स्थानीय बिल्ड के लिए, प्रतीक फ़ाइलें out/target/product/<product>/symbols/ में पाई जा सकती हैं।

एओएसपी बिल्ड के लिए (उदाहरण के लिए फ्लैशस्टेशन से फ्लैश किया गया), बिल्ड एंड्रॉइड सीआई पर पाया जा सकता है। निर्माण के लिए "कलाकृतियों" में, एक `${PRODUCT}-symbols-${BUILDID}.zip` फ़ाइल होगी।

अपने संगठन के आंतरिक निर्माण के लिए, प्रतीक फ़ाइलें प्राप्त करने में सहायता के लिए अपने संगठन के दस्तावेज़ की जाँच करें।

प्रतीक

hwasan_symbolize –-symbols <DECOMPRESSED_DIR>/out/target/product/*/symbols < crash

स्टैक रिपोर्ट को समझना

स्टैक वेरिएबल्स के साथ होने वाली बग के लिए, HWASan रिपोर्ट में इस तरह के विवरण होंगे:

Cause: stack tag-mismatch
Address 0x007d4d251e80 is located in stack of thread T64
Thread: T64 0x0074000b2000 stack: [0x007d4d14c000,0x007d4d255cb0) sz: 1088688 tls: [0x007d4d255fc0,0x007d4d259000)
Previously allocated frames:
  record_addr:0x7df7300c98 record:0x51ef007df3f70fb0  (/apex/com.android.art/lib64/libart.so+0x570fb0)
  record_addr:0x7df7300c90 record:0x5200007df3cdab74  (/apex/com.android.art/lib64/libart.so+0x2dab74)
  [...]
	

स्टैक बग को समझने की अनुमति देने के लिए, HWASan अतीत में हुए स्टैक फ़्रेमों पर नज़र रखता है। वर्तमान में, HWASan इसे बग रिपोर्ट में मानव-समझने योग्य सामग्री में परिवर्तित नहीं करता है, और इसके लिए एक अतिरिक्त प्रतीकीकरण चरण की आवश्यकता होती है।

ओडीआर उल्लंघन

HWASan द्वारा रिपोर्ट किए गए कुछ उपयोग-बाद-मुक्त बग वन डेफिनिशन रूल (ODR) उल्लंघन का संकेत भी दे सकते हैं। ओडीआर उल्लंघन तब होता है जब एक ही प्रोग्राम में एक ही चर को कई बार परिभाषित किया जाता है। इसका मतलब यह भी है कि वेरिएबल कई बार नष्ट हो जाता है, जिससे उपयोग-बाद-मुक्त त्रुटि हो सकती है।

प्रतीकीकरण के बाद, ओडीआर उल्लंघन अमान्य एक्सेस स्टैक और "यहाँ मुक्त" स्टैक दोनों पर __cxa_finalize के साथ उपयोग-बाद-मुक्त दिखाता है। "यहां पहले से आवंटित" स्टैक में __dl__ZN6soinfo17call_constructorsEv शामिल है और इसे आपके प्रोग्राम में उस स्थान पर इंगित करना चाहिए जो स्टैक पर उच्चतर चर को परिभाषित करता है।

ओडीआर का उल्लंघन होने का एक कारण यह है कि जब स्थैतिक पुस्तकालयों का उपयोग किया जाता है। यदि एक स्थिर लाइब्रेरी जो C++ ग्लोबल को परिभाषित करती है, कई साझा लाइब्रेरी या निष्पादन योग्य से जुड़ी हुई है, तो एक ही प्रतीक की कई परिभाषाएँ एक ही पता स्थान में विद्यमान हो सकती हैं, जो ODR त्रुटि का कारण बनेगी।

समस्या निवारण

"HWAddressSanitizer पते का अधिक विस्तार से वर्णन नहीं कर सकता।"

कभी-कभी HWASan में पिछले मेमोरी आवंटन के बारे में जानकारी के लिए जगह ख़त्म हो सकती है। उस स्थिति में, रिपोर्ट में तत्काल मेमोरी एक्सेस के लिए केवल एक स्टैक ट्रेस होगा, उसके बाद एक नोट होगा:

  HWAddressSanitizer can not describe address in more detail.

कुछ मामलों में परीक्षण को कई बार चलाकर इसका समाधान किया जा सकता है। दूसरा विकल्प HWASan इतिहास का आकार बढ़ाना है। यह विश्व स्तर पर build/soong/cc/sanitize.go ( hwasanGlobalOptions देखें ) में किया जा सकता है, या आपके प्रक्रिया परिवेश में (वर्तमान सेटिंग्स देखने के लिए adb shell echo $HWASAN_OPTIONS आज़माएं)।

यह तब भी हो सकता है यदि एक्सेस की गई मेमोरी को मैप नहीं किया गया है, या गैर-HWASan जागरूक आवंटनकर्ता द्वारा आवंटित नहीं किया गया है। इस मामले में, क्रैश हेडर में सूचीबद्ध mem टैग आम तौर पर 00 होगा। यदि आपके पास पूर्ण समाधि स्थल तक पहुंच है, तो यह पता लगाने के लिए मेमोरी मैप डंप से परामर्श करना सहायक हो सकता है कि पता किस मैपिंग (यदि कोई है) से संबंधित है।

"एक ही धागे में नेस्टेड बग"

इसका मतलब है कि HWASan क्रैश-रिपोर्ट बनाते समय एक बग था। यह आमतौर पर HWASan रनटाइम में एक बग के कारण होता है, कृपया एक बग दर्ज करें और यदि संभव हो तो समस्या को पुन: उत्पन्न करने के निर्देश प्रदान करें।