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

जब HWASan टूल मेमोरी बग का पता लगाता है, तो प्रक्रिया को abort () के साथ समाप्त कर दिया जाता है, और एक रिपोर्ट stderr और logcat को प्रिंट कर दी जाती है। Android पर सभी देशी क्रैश की तरह, 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 का गुणज नहीं है, तो शेष आकार को मेमोरी टैग के रूप में संग्रहीत किया जाएगा और टैग को छोटे ग्रेन्युल टैग के रूप में संग्रहीत किया जाएगा। ऊपर दिए गए उदाहरण में, बोल्ड किए गए आवंटन टैग किए गए विज्ञापन के ठीक बाद, हमारे पास टैग 5c का 5 × 16 + 4 = 84 बाइट आवंटन है।

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

रजिस्टर डंप

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

प्रतीकीकरण

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

पहली बार सेटअप: llvm-symbolizer स्थापित करें

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

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

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

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

एओएसपी बिल्ड के लिए (उदाहरण के लिए फ्लैशस्टेशन से फ्लैश किया गया), बिल्ड एंड्रॉइड सीआई पर पाया जा सकता है। निर्माण के लिए "कलाकृतियों" में, एक `${PRODUCT}-प्रतीक-${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 इसे बग रिपोर्ट में मानव-समझने योग्य सामग्री में परिवर्तित नहीं करता है, और इसके लिए एक अतिरिक्त प्रतीकात्मक चरण की आवश्यकता होती है।

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

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

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

  HWAddressSanitizer can not describe address in more detail.

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

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

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