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

जब HWASan टूल मेमोरी बग का पता लगाता है, तो प्रक्रिया को गर्भपात () के साथ समाप्त कर दिया जाता है, और एक रिपोर्ट को 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 इंस्टॉल करें

प्रतीक करने के लिए, आपके सिस्टम में $PATH से llvm-प्रतीक स्थापित और पहुंच योग्य होना चाहिए। डेबियन पर, आप इसे 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 इसे बग रिपोर्ट में मानव-समझने योग्य सामग्री में परिवर्तित नहीं करता है, और इसके लिए एक अतिरिक्त प्रतीकात्मक चरण की आवश्यकता होती है।

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

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

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

  HWAddressSanitizer can not describe address in more detail.

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

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

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