যখন 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: '==9569==ERROR: HWAddressSanitizer: tag-mismatch on address 0x00433ae20045 at pc 0x00623ae2a9cc READ of size 1 at 0x00433ae20045 tags: 5b/83 (ptr/mem) in thread T0 #0 0x7240450c68 (/system/lib64/vndk-sp-R/libcutils.so+0x8c68) #1 0x723dffd490 (/vendor/lib64/sensors.ssc.so+0x34490) #2 0x723e0126e0 (/vendor/lib64/sensors.ssc.so+0x496e0) [...] [0x00433ae20040,0x00433ae20060) is a small unallocated heap chunk; size: 32 offset: 5 Cause: use-after-free 0x00433ae20045 is located 5 bytes inside of 10-byte region [0x00433ae20040,0x00433ae2004a) freed by thread T0 here: #0 0x72404d1b18 (/system/lib64/libclang_rt.hwasan-aarch64-android.so+0x10b18) #1 0x723af23040 (/vendor/lib64/libgralloccore.so+0x5040) #2 0x723af23fa4 (/vendor/lib64/libgralloccore.so+0x5fa4) [...] previously allocated here: #0 0x72404ce554 (/system/lib64/libclang_rt.hwasan-aarch64-android.so+0xd554) #1 0x7240115654 (/apex/com.android.runtime/lib64/bionic/libc.so+0x43654) #2 0x7240450ac8 (/system/lib64/vndk-sp-R/libcutils.so+0x8ac8) [...] hwasan_dev_note_heap_rb_distance: 1 1023 hwasan_dev_note_num_matching_addrs: 0 hwasan_dev_note_num_matching_addrs_4b: 0 Thread: T0 0x006a00002000 stack: [0x007fc1064000,0x007fc1864000) sz: 8388608 tls: [0x00737702ffc0,0x007377033000) Memory tags around the buggy address (one tag corresponds to 16 bytes): 0x006f33ae1f80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1f90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1fa0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1fb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 =>0x006f33ae2000: 08 00 08 00 [83] 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Tags for short granules around the buggy address (one tag corresponds to 16 bytes): 0x006f33ae1ff0: .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. =>0x006f33ae2000: 72 .. d0 .. [..] .. .. .. .. .. .. .. .. .. .. .. 0x006f33ae2010: .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. See https://clang.llvm.org/docs/HardwareAssistedAddressSanitizerDesign.html#short-granules for a description of short granule tags Registers where the failure occurred (pc 0x00623ae2a9cc): x0 0000007fc18623ec x1 5b0000433ae20045 x2 0000000000000013 x3 ffffffffffffffff x4 ffffffffffffffff x5 0000007fc1861da3 x6 6f7420676e696f47 x7 45522061206f6420 x8 0000000000000000 x9 0200006b00000000 x10 00000007fc18623f x11 5b0000433ae20040 x12 6f64206f7420676e x13 0a44414552206120 x14 0000000000000010 x15 ffffffffffffffff x16 000000737169ac94 x17 0000000000000007 x18 0000007377bd8000 x19 0000007fc1862498 x20 0200006b00000000 x21 0000007fc18624a8 x22 0000000000000001 x23 0000000000000000 x24 0000000000000000 x25 0000000000000000 x26 0000000000000000 x27 0000000000000000 x28 0000000000000000 x29 0000007fc1862410 x30 000000623ae2a9d0 sp 0000007fc18623d0 SUMMARY: HWAddressSanitizer: tag-mismatch (/system/lib64/vndk-sp-R/libcutils.so+0x8c68) [ … regular crash dump follows …]
এটি একটি AddressSanitizer রিপোর্টের অনুরূপ। সেগুলোর থেকে ভিন্ন, প্রায় সমস্ত HWASan বাগই হলো ট্যাগ-অমিলের ত্রুটি, অর্থাৎ, এমন একটি মেমরি অ্যাক্সেস যেখানে একটি পয়েন্টার ট্যাগ সংশ্লিষ্ট মেমরি ট্যাগের সাথে মেলে না। এটি নিম্নলিখিতগুলির মধ্যে যেকোনো একটি হতে পারে:
- স্ট্যাক বা হিপে সীমার বাইরের অ্যাক্সেস
- হিপে ইউজ-আফটার-ফ্রি ত্রুটি
- স্ট্যাকে ইউজ-আফটার-রিটার্ন ত্রুটি
বিভাগ
এখানে HWASan প্রতিবেদনের প্রতিটি অংশের ব্যাখ্যা দেওয়া হলো।
অ্যাক্সেস ত্রুটি
ত্রুটিপূর্ণ মেমরি অ্যাক্সেস সম্পর্কিত তথ্য ধারণ করে, যার মধ্যে রয়েছে:
- অ্যাক্সেসের ধরণ (
READবনামWRITE) - অ্যাক্সেস সাইজ (কত বাইট অ্যাক্সেস করার চেষ্টা করা হয়েছিল)
- অ্যাক্সেসের থ্রেড নম্বর
- পয়েন্টার এবং মেমরি ট্যাগ (উন্নত ডিবাগিংয়ের জন্য)
অ্যাক্সেস স্ট্যাক ট্রেস
ত্রুটিপূর্ণ মেমোরি অ্যাক্সেসের স্ট্যাক ট্রেস। প্রতীকায়নের জন্য প্রতীকায়ন দেখুন।
কারণ
ত্রুটিপূর্ণ অ্যাক্সেসের সম্ভাব্য কারণ। যদি একাধিক সম্ভাব্য কারণ থাকে, তবে সেগুলোকে সম্ভাবনার ক্রম অনুসারে তালিকাভুক্ত করা হয়। এটি সম্ভাব্য কারণ সম্পর্কিত বিস্তারিত তথ্যের আগে আসে। 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: | |
| স্ট্যাক ট্যাগ অমিল | স্ট্যাক রিপোর্ট ওভারফ্লো বা আন্ডারফ্লো এবং ইউজ-আফটার-রিটার্ন বাগের মধ্যে পার্থক্য করে না। এছাড়াও, ত্রুটির উৎস স্ট্যাক অ্যালোকেশনটি খুঁজে বের করার জন্য একটি অফলাইন সিম্বলাইজেশন ধাপের প্রয়োজন হয়। স্ট্যাক রিপোর্ট বুঝুন দেখুন। | |
| অবৈধ বিনামূল্যে | বিনামূল্যে ব্যবহারের পর | এটি একটি ডাবল ফ্রি বাগ। প্রসেস শাটডাউনের সময় এটি ঘটলে, তা একটি ODR লঙ্ঘনের ইঙ্গিত দিতে পারে। <address> is located N bytes inside of M-byte region [<start>, <end>) freed by thread T0 here: |
| ঠিকানা বর্ণনা করা সম্ভব নয় | হয় একটি ওয়াইল্ড ফ্রি (যে মেমরি আগে বরাদ্দ করা হয়নি তা মুক্ত করা), অথবা HWASan-এর ফ্রি বাফার থেকে বরাদ্দকৃত মেমরি সরিয়ে দেওয়ার পর একটি ডাবল ফ্রি। | |
| 0x... হলো HWAsan শ্যাডো মেমরি | একটি অনিয়ন্ত্রিত মুক্ত প্রবাহ, কারণ অ্যাপটি HWASan-এর অভ্যন্তরীণ মেমরি মুক্ত করার চেষ্টা করছিল। |
ডিলোকেশন স্ট্যাক ট্রেস
মেমরি কোথায় ডিঅ্যালোকেট করা হয়েছিল তার স্ট্যাক ট্রেস। শুধুমাত্র ইউজ-আফটার-ফ্রি বা ইনভ্যালিড-ফ্রি বাগের ক্ষেত্রে উপস্থিত থাকে। সিম্বোলাইজ করার জন্য সিম্বোলাইজেশন দেখুন।
বরাদ্দ স্ট্যাক ট্রেস
মেমরি কোথায় বরাদ্দ করা হয়েছিল তার স্ট্যাক ট্রেস। প্রতীকায়নের জন্য প্রতীকায়ন দেখুন।
উন্নত ডিবাগিং তথ্য
HWASan রিপোর্টে কিছু উন্নত ডিবাগিং তথ্যও রয়েছে, যার মধ্যে (ক্রমানুসারে) অন্তর্ভুক্ত রয়েছে:
- প্রক্রিয়ার থ্রেডগুলির তালিকা
- প্রক্রিয়ার থ্রেডগুলির তালিকা
- ত্রুটিপূর্ণ মেমরির নিকটবর্তী মেমরি ট্যাগগুলির মান
- মেমরি অ্যাক্সেসের মুহূর্তে রেজিস্টারগুলোর ডাম্প
মেমরি ট্যাগ ডাম্প
আপনি পয়েন্টার ট্যাগের মতো একই ট্যাগযুক্ত কাছাকাছি মেমরি অ্যালোকেশনগুলি খুঁজতে ট্যাগ মেমরি ডাম্প ব্যবহার করতে পারেন। এই ট্যাগগুলি একটি বড় অফসেট সহ সীমার বাইরের অ্যাক্সেস নির্দেশ করতে পারে। একটি ট্যাগ ১৬ বাইট মেমরির সমান; পয়েন্টার ট্যাগ হলো অ্যাড্রেসের উপরের ৮ বিট। ট্যাগ মেমরি ডাম্প কিছু ইঙ্গিত দিতে পারে, উদাহরণস্বরূপ, নিম্নলিখিতটি ডানদিকে একটি বাফার ওভারফ্লো:
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 .. .. .. .. .. .. .. .. .. .. .. .. .. ..
লক্ষ্য করুন, বাম দিকে ৬ × ১৬ = ৯৬ বাইটের ad ট্যাগগুলোর একটি ধারা রয়েছে যা পয়েন্টার ট্যাগটির সাথে মিলে যায়।
যদি কোনো অ্যালোকেশনের সাইজ ১৬-এর গুণিতক না হয়, তবে সাইজের অবশিষ্ট অংশ মেমরি ট্যাগ হিসেবে সংরক্ষিত হয় এবং ট্যাগটি একটি শর্ট গ্র্যানিউল ট্যাগ হিসেবে সংরক্ষিত হয়। পূর্ববর্তী উদাহরণে, ad ট্যাগযুক্ত বোল্ড করা অ্যালোকেশনটির ঠিক পরেই, 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/থাকে। - AOSP বিল্ডগুলির জন্য (উদাহরণস্বরূপ, অ্যান্ড্রয়েড ফ্ল্যাশ টুল থেকে ফ্ল্যাশ করা), বিল্ডগুলি অ্যান্ড্রয়েড সিআই- তে থাকে। বিল্ডের আর্টিফ্যাক্টস -এর মধ্যে একটি
${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) লঙ্ঘনের ইঙ্গিত দিতে পারে। একটি ODR লঙ্ঘন ঘটে যখন একই প্রোগ্রামে একই ভেরিয়েবল একাধিকবার সংজ্ঞায়িত করা হয়। এর মানে হলো, ভেরিয়েবলটি একাধিকবার ডেস্ট্রাক্ট করা হয়, যা ইউজ-আফটার-ফ্রি ত্রুটির কারণ হতে পারে।
সিম্বলাইজেশনের পরে, ODR ভায়োলেশনগুলো অবৈধ অ্যাক্সেস স্ট্যাক এবং মুক্ত করা here স্ট্যাক উভয় ক্ষেত্রেই __cxa_finalize সাথে একটি use-after-free ত্রুটি দেখায়। পূর্বে বরাদ্দ করা here স্ট্যাকে __dl__ZN6soinfo17call_constructorsEv থাকে এবং এটি আপনার প্রোগ্রামের সেই অবস্থানকে নির্দেশ করা উচিত যেখানে স্ট্যাকের উপরের দিকে ভেরিয়েবলটি সংজ্ঞায়িত করা হয়েছে।
স্ট্যাটিক লাইব্রেরি ব্যবহার করা হলে ODR লঙ্ঘিত হতে পারে। যদি কোনো স্ট্যাটিক লাইব্রেরি, যা একটি 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 রানটাইমের একটি বাগের কারণে হয়ে থাকে। একটি বাগ রিপোর্ট করুন এবং সম্ভব হলে, সমস্যাটি কীভাবে পুনরায় তৈরি করা যায় তার নির্দেশাবলী প্রদান করুন।