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 রিপোর্টের প্রতিটি বিভাগের একটি ব্যাখ্যা নীচে দেওয়া হল:

অ্যাক্সেস ত্রুটি

খারাপ মেমরি অ্যাক্সেস সম্পর্কে তথ্য রয়েছে, যার মধ্যে রয়েছে:

  • অ্যাক্সেসের ধরন ("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 রিপোর্টে কিছু উন্নত ডিবাগিং তথ্যও রয়েছে, যার মধ্যে রয়েছে (ক্রম অনুসারে):

  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-সিম্বোলাইজার ইনস্টল করুন

প্রতীকী করার জন্য, আপনার সিস্টেমে অবশ্যই llvm-সিম্বোলাইজার ইনস্টল থাকতে হবে এবং $PATH থেকে অ্যাক্সেসযোগ্য। ডেবিয়ানে, আপনি sudo apt install llvm ব্যবহার করে এটি ইনস্টল করতে পারেন।

প্রতীক ফাইল প্রাপ্ত

প্রতীকীকরণের জন্য, আমাদের প্রতীক ধারণ করে আনস্ট্রিপড বাইনারি প্রয়োজন। এগুলি কোথায় পাওয়া যাবে তা নির্ভর করে বিল্ডের ধরণের উপর:

স্থানীয় বিল্ডগুলির জন্য, প্রতীক ফাইলগুলি out/target/product/<product>/symbols/ এ পাওয়া যাবে।

AOSP বিল্ডগুলির জন্য (যেমন ফ্ল্যাশস্টেশন থেকে ফ্ল্যাশ করা হয়েছে), বিল্ডগুলি অ্যান্ড্রয়েড সিআই- তে পাওয়া যাবে। বিল্ডের জন্য "আর্টিফ্যাক্টস"-এ একটি `${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 এটিকে বাগ রিপোর্টে মানব-বোধগম্য বিষয়বস্তুতে রূপান্তরিত করে না এবং একটি অতিরিক্ত প্রতীকী পদক্ষেপের প্রয়োজন।

ওডিআর লঙ্ঘন

HWASan দ্বারা রিপোর্ট করা কিছু ব্যবহারের পরে-মুক্ত বাগগুলিও একটি ওয়ান ডেফিনিশন রুল (ODR) লঙ্ঘন নির্দেশ করতে পারে। একটি ODR লঙ্ঘন ঘটে যখন একই ভেরিয়েবল একই প্রোগ্রামে একাধিকবার সংজ্ঞায়িত করা হয়। এর মানে হল যে পরিবর্তনশীলটি একাধিকবার ধ্বংস করা হয়েছে, যা ব্যবহার-পর-মুক্ত ত্রুটির দিকে নিয়ে যেতে পারে।

প্রতীকীকরণের পরে, ODR লঙ্ঘনগুলি অবৈধ অ্যাক্সেস স্ট্যাক এবং "এখানে মুক্ত" স্ট্যাক উভয় ক্ষেত্রেই __cxa_finalize এর সাথে ব্যবহার-পর-মুক্ত প্রদর্শন করে। "আগে এখানে বরাদ্দ করা" স্ট্যাকে __dl__ZN6soinfo17call_constructorsEv রয়েছে এবং আপনার প্রোগ্রামের অবস্থানের দিকে নির্দেশ করা উচিত যা স্ট্যাকের উচ্চতর পরিবর্তনশীলকে সংজ্ঞায়িত করে।

ওডিআর লঙ্ঘন হওয়ার একটি কারণ হল যখন স্ট্যাটিক লাইব্রেরি ব্যবহার করা হয়। যদি একটি স্ট্যাটিক লাইব্রেরি যা একটি C++ গ্লোবালকে সংজ্ঞায়িত করে একাধিক শেয়ার্ড লাইব্রেরি বা এক্সিকিউটেবলের সাথে লিঙ্ক করা হয়, তাহলে একই চিহ্নের একাধিক সংজ্ঞা একই ঠিকানার জায়গায় বিদ্যমান থাকতে পারে, যা একটি ODR ত্রুটির কারণ হবে।

সমস্যা সমাধান

"HWAddress স্যানিটাইজার আরও বিস্তারিতভাবে ঠিকানা বর্ণনা করতে পারে না।"

কখনও কখনও 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 রানটাইমে একটি ত্রুটির কারণে হয়, অনুগ্রহ করে একটি বাগ ফাইল করুন এবং সম্ভব হলে কীভাবে সমস্যাটি পুনরুত্পাদন করা যায় তার নির্দেশাবলী প্রদান করুন৷