অ্যান্ড্রয়েড এনডিকে, এনডিকে আর২১ এবং অ্যান্ড্রয়েড ১০ (এপিআই লেভেল ২৯) থেকে এইচডব্লিউঅ্যাড্রেস স্যানিটাইজার (HWAddress Sanitizer ), যা এইচডব্লিউএস্যান (HWASan) নামেও পরিচিত, সমর্থন করে। এইচডব্লিউএস্যান শুধুমাত্র ৬৪-বিট আর্ম ডিভাইসে উপলব্ধ।
HWASan হলো ASan-এর অনুরূপ একটি মেমরি ত্রুটি সনাক্তকরণ টুল। ক্লাসিক ASan-এর তুলনায় HWASan-এর রয়েছে:
- অনুরূপ সিপিইউ ওভারহেড (~২ গুণ)
- অনুরূপ কোড আকারের ওভারহেড (৪০ – ৫০%)
- অনেক কম র্যাম ওভারহেড (১০% – ৩৫%)
HWASan, ASan-এর মতোই একই ধরনের বাগ শনাক্ত করে:
- স্ট্যাক এবং হিপ বাফার ওভারফ্লো বা আন্ডারফ্লো
- বিনামূল্যে ব্যবহারের পর প্রচুর ব্যবহার।
- স্কোপের বাইরে স্ট্যাক ব্যবহার
- ডাবল ফ্রি অথবা ওয়াইল্ড ফ্রি
এছাড়াও, HWASan আরও শনাক্ত করে:
- রিটার্নের পরে স্ট্যাক ব্যবহার
নমুনা অ্যাপ
একটি নমুনা অ্যাপে দেখানো হয়েছে কীভাবে hwasan-এর জন্য একটি বিল্ড ভ্যারিয়েন্ট কনফিগার করতে হয়।
নির্মাণ করুন
HWAddress Sanitizer ব্যবহার করে আপনার অ্যাপের নেটিভ (JNI) কোড বিল্ড করতে, নিম্নলিখিতগুলি করুন:
এনডিকে-বিল্ড
আপনার Application.mk ফাইলে:
APP_STL := c++_shared # Or system, or none, but not c++_static.
APP_CFLAGS := -fsanitize=hwaddress -fno-omit-frame-pointer
APP_LDFLAGS := -fsanitize=hwaddress
CMake (Gradle Groovy)
আপনার মডিউলের build.gradle ফাইলে:
android {
defaultConfig {
externalNativeBuild {
cmake {
# Can also use system or none as ANDROID_STL, but not c++_static.
arguments "-DANDROID_STL=c++_shared"
}
}
}
}
আপনার CMakeLists.txt-এর প্রতিটি টার্গেটের জন্য:
target_compile_options(${TARGET} PUBLIC -fsanitize=hwaddress -fno-omit-frame-pointer)
target_link_options(${TARGET} PUBLIC -fsanitize=hwaddress)
NDK 27 বা তার পরবর্তী সংস্করণের সাথে, আপনি আপনার build.gradle এ নিম্নলিখিতটি ব্যবহার করতে পারেন এবং CMakeLists.txt পরিবর্তন করার প্রয়োজন নেই:
android {
defaultConfig {
externalNativeBuild {
cmake {
arguments "-DANDROID_SANITIZE=hwaddress"
}
}
}
}
ANDROID_USE_LEGACY_TOOLCHAIN_FILE=false ব্যবহার করলে এটি কাজ করবে না।
CMake (Gradle Kotlin)
আপনার মডিউলের build.gradle ফাইলে:
android {
defaultConfig {
externalNativeBuild {
cmake {
# Can also use system or none as ANDROID_STL, but not c++_static.
arguments += "-DANDROID_STL=c++_shared"
}
}
}
}
আপনার CMakeLists.txt-এর প্রতিটি টার্গেটের জন্য:
target_compile_options(${TARGET} PUBLIC -fsanitize=hwaddress -fno-omit-frame-pointer)
target_link_options(${TARGET} PUBLIC -fsanitize=hwaddress)
NDK 27 বা তার পরবর্তী সংস্করণের সাথে, আপনি আপনার build.gradle এ নিম্নলিখিতটি ব্যবহার করতে পারেন এবং CMakeLists.txt পরিবর্তন করার প্রয়োজন নেই:
android {
defaultConfig {
externalNativeBuild {
cmake {
arguments += "-DANDROID_SANITIZE=hwaddress"
}
}
}
}
ANDROID_USE_LEGACY_TOOLCHAIN_FILE=false ব্যবহার করলে এটি কাজ করবে না।
অ্যান্ড্রয়েড ১৪ বা তার পরবর্তী সংস্করণ: wrap.sh যোগ করুন।
আপনি যদি অ্যান্ড্রয়েড ১৪ বা তার পরবর্তী সংস্করণ ব্যবহার করেন, তাহলে যেকোনো অ্যান্ড্রয়েড-চালিত ডিভাইসে আপনার ডিবাগযোগ্য অ্যাপটি চালানোর জন্য একটি wrap.sh স্ক্রিপ্ট ব্যবহার করতে পারেন। আপনি যদি সেটআপ নির্দেশাবলীতে দেওয়া ধাপগুলো অনুসরণ করার সিদ্ধান্ত নিয়ে থাকেন, তাহলে এই ধাপটি এড়িয়ে যেতে পারেন।
arm64-v8a এর জন্য নিম্নলিখিত wrap.sh স্ক্রিপ্টটি যোগ করতে, একটি wrap.sh স্ক্রিপ্ট প্যাকেজ করার জন্য নির্দেশাবলী অনুসরণ করুন।
#!/system/bin/sh
LD_HWASAN=1 exec "$@"
দৌড়
আপনি যদি অ্যান্ড্রয়েড ১৪-এর চেয়ে পুরোনো কোনো সংস্করণ ব্যবহার করেন, অথবা wrap.sh স্ক্রিপ্ট যোগ না করে থাকেন, তাহলে আপনার অ্যাপটি চালানোর আগে সেটআপ নির্দেশাবলী অনুসরণ করুন।
অ্যাপটি যথারীতি চালান। যখন কোনো মেমরি ত্রুটি শনাক্ত হয়, তখন অ্যাপটি SIGABRT সহ ক্র্যাশ করে এবং logcat-এ একটি বিস্তারিত বার্তা প্রিন্ট করে। বার্তাটির একটি অনুলিপি /data/tombstones অধীনে একটি ফাইলে পাওয়া যাবে এবং এটি দেখতে এইরকম:
ERROR: HWAddressSanitizer: tag-mismatch on address 0x0042a0826510 at pc 0x007b24d90a0c
WRITE of size 1 at 0x0042a0826510 tags: 32/3d (ptr/mem) in thread T0
#0 0x7b24d90a08 (/data/app/com.example.hellohwasan-eRpO2UhYylZaW0P_E0z7vA==/lib/arm64/libnative-lib.so+0x2a08)
#1 0x7b8f1e4ccc (/apex/com.android.art/lib64/libart.so+0x198ccc)
#2 0x7b8f1db364 (/apex/com.android.art/lib64/libart.so+0x18f364)
#3 0x7b8f2ad8d4 (/apex/com.android.art/lib64/libart.so+0x2618d4)
0x0042a0826510 is located 0 bytes to the right of 16-byte region [0x0042a0826500,0x0042a0826510)
allocated here:
#0 0x7b92a322bc (/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so+0x212bc)
#1 0x7b24d909e0 (/data/app/com.example.hellohwasan-eRpO2UhYylZaW0P_E0z7vA==/lib/arm64/libnative-lib.so+0x29e0)
#2 0x7b8f1e4ccc (/apex/com.android.art/lib64/libart.so+0x198ccc)
বার্তাটির সাথে অতিরিক্ত ডিবাগিং তথ্য থাকতে পারে, যার মধ্যে অন্তর্ভুক্ত রয়েছে অ্যাপ্লিকেশনটিতে চলমান থ্রেডগুলোর তালিকা, কাছাকাছি মেমরি অ্যালোকেশনের ট্যাগ এবং সিপিইউ রেজিস্টারের মান।
HWASan ত্রুটির বার্তা সম্পর্কে আরও তথ্যের জন্য 'Understanding HWASan reports' দেখুন।
কমান্ড-লাইন এক্সিকিউটেবল তৈরি করা
আপনি অ্যান্ড্রয়েড ১৪ এবং তার পরবর্তী সংস্করণগুলিতে HWASan দিয়ে ইন্সট্রুমেন্টেড এক্সিকিউটেবল তৈরি ও চালাতে পারবেন। আপনার এক্সিকিউটেবলগুলির জন্য আপনি 'Build for ndk-build' বা 'CMake'-এ বর্ণিত একই কনফিগারেশন ব্যবহার করতে পারেন। এক্সিকিউটেবলগুলি অ্যান্ড্রয়েড ১৪ বা তার পরবর্তী সংস্করণে চালিত কোনো ডিভাইসে পুশ করুন এবং শেল ব্যবহার করে স্বাভাবিকভাবে এটি চালান।
আপনি যদি libc++ ব্যবহার করেন, তাহলে নিশ্চিত করুন যে আপনি শেয়ার্ড STL ব্যবহার করছেন এবং এটিকে ডিভাইসে পুশ করছেন, এবং আপনার বাইনারি চালানোর সময় LD_LIBRARY_PATH কে সেই ডিরেক্টরিতে সেট করুন যেখানে এটি রয়েছে।
আপনি যদি Gradle ব্যবহার না করেন, তাহলে CMake এবং ndk-build দিয়ে কমান্ড লাইন থেকে কীভাবে বিল্ড করতে হয় তা জানতে NDK ডকুমেন্টেশন দেখুন।
অ্যান্ড্রয়েড ১৩ বা তার পূর্ববর্তী সংস্করণ: সেটআপ
আপনার ডিভাইসটি যদি অ্যান্ড্রয়েড ১৪ বা তার পরবর্তী সংস্করণে চলে, তাহলে আপনি এই ধাপটি বাদ দিয়ে Build সেকশনে wrap.sh ব্যবহারের নির্দেশাবলী অনুসরণ করতে পারেন। আপনি চাইলে শুধু এই সেকশনটি অনুসরণ করে wrap.sh ব্যবহারের নির্দেশাবলী বাদও দিতে পারেন।
অ্যান্ড্রয়েড ১৪-এর আগে, HWASan অ্যাপ্লিকেশনগুলো চালানোর জন্য অ্যান্ড্রয়েডের একটি HWASan বিল্ড প্রয়োজন হতো। আপনি সমর্থিত পিক্সেল ডিভাইসগুলোতে আগে থেকে তৈরি করা HWASan ইমেজ ফ্ল্যাশ করতে পারেন। বিল্ডগুলো ci.android.com- এ পাওয়া যায়, যেখানে আপনি আপনার পছন্দের নির্দিষ্ট বিল্ডটির জন্য বর্গাকার আইকনে ক্লিক করে একটি ফ্ল্যাশ বিল্ড লিঙ্ক পেতে পারেন। এর জন্য আপনার ফোনের কোডনেম জানা প্রয়োজন।

এর পরিবর্তে সরাসরি flash.android.com- এ যাওয়া আরও সহজ হতে পারে, কারণ সেখানে প্রক্রিয়াটি আপনার ডিভাইস শনাক্ত করার মাধ্যমে শুরু হয় এবং শুধুমাত্র ব্যবহারযোগ্য বিল্ডগুলোই আপনাকে দেখায়। নিচের ছবিগুলোতে এই টুলের সেটআপ প্রক্রিয়াটি তুলে ধরা হয়েছে।
আপনার ডিভাইসে ডেভেলপার মোড চালু করুন এবং একটি ইউএসবি ক্যাবল ব্যবহার করে এটিকে আপনার কম্পিউটারের সাথে সংযুক্ত করুন। ‘Add new device’-এ ক্লিক করুন, ডায়ালগ থেকে আপনার ডিভাইসটি নির্বাচন করুন এবং ‘Connect’-এ ক্লিক করুন।


আপনার ডিভাইসটি সংযুক্ত হওয়ার পর, বিল্ড কনফিগার করতে সেটিতে ক্লিক করুন। 'Select a build ID' বক্সে, aosp-master-with-phones-throttled ব্রাঞ্চটি নির্বাচন করুন, যাতে আপনার সংযুক্ত ডিভাইসটির জন্য সঠিক ইমেজটি স্বয়ংক্রিয়ভাবে বেছে নেওয়া হয়।


আপনার ডিভাইসটি ফ্ল্যাশ করতে ইনস্টল-এ ক্লিক করুন।
প্রয়োজনীয় সেটআপ সম্পর্কে আরও বিস্তারিত তথ্য অ্যান্ড্রয়েড ফ্ল্যাশ টুল ডকুমেন্টেশনে রয়েছে। বিকল্পভাবে, সোর্স থেকে একটি HWASan ইমেজ তৈরির নির্দেশাবলীর জন্য আপনি AOSP ডকুমেন্টেশন দেখতে পারেন।