Android NDK-তে HWAddress Sanitizer কাজ করে, যা HWASan নামেও পরিচিত, এটি NDK r21 ও Android 10 (API লেভেল ২৯) থেকে শুরু হয়েছে। HWASan শুধুমাত্র ৬৪-বিট Arm ডিভাইসে উপলভ্য।
HWASan হল ASan-এর মতো মেমরি সংক্রান্ত সমস্যা ডিটেক্ট করার টুল। ক্লাসিক ASan-এর তুলনায়, HWASan-এ এগুলি আছে:
- একই ধরনের CPU ওভারহেড (~২x)
- একই ধরনের কোড সাইজ ওভারহেড (৪০ – ৫০%)
- অনেক কম RAM ওভারহেড (১০% – ৩৫%)
HWASan, ASan-এর মতো একই ধরনের বাগ শনাক্ত করে:
- স্ট্যাক ও হিপ বাফার ওভারফ্লো বা আন্ডারফ্লো
- ফ্রি করার পরে হিপ ব্যবহার করা
- স্ট্যাকের ব্যবহার স্কোপের বাইরে
- ডবল ফ্রি বা ওয়াইল্ড ফ্রি
এছাড়াও, HWASan এগুলিও শনাক্ত করে:
- রিটার্ন করার পরে স্ট্যাক ব্যবহার
স্যাম্পেল অ্যাপ
একটি স্যাম্পেল অ্যাপ দেখায় যে hwasan-এর জন্য কীভাবে বিল্ড ভেরিয়েন্ট কনফিগার করতে হয়।
বিল্ড
HWAddress Sanitizer-এর সাহায্যে আপনার অ্যাপের নেটিভ (JNI) কোড তৈরি করতে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:
ndk-build
আপনার 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 ব্যবহার করার সময় এটি কাজ করবে না।
Android 14 বা এর পরের যেকোনও ভার্সন: wrap.sh যোগ করুন
আপনি Android 14 বা তার পরবর্তী যেকোনও ভার্সন ব্যবহার করলে, যেকোনও Android-চালিত ডিভাইসে আপনার ডিবাগ করা যায় এমন অ্যাপ রান করাতে wrap.sh স্ক্রিপ্ট ব্যবহার করতে পারবেন। আপনি সেট-আপ সংক্রান্ত নির্দেশাবলী-তে উল্লেখ করা ধাপগুলি অনুসরণ করার সিদ্ধান্ত নিলে, এই ধাপটি এড়িয়ে যেতে পারেন।
arm64-v8a-এর জন্য নিম্নলিখিত wrap.sh স্ক্রিপ্ট যোগ করতে
wrap.sh স্ক্রিপ্ট প্যাকেজ করুন
।
#!/system/bin/sh
LD_HWASAN=1 exec "$@"
চালান
আপনি 14-এর চেয়ে পুরনো Android ভার্সন ব্যবহার করলে অথবা 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 ত্রুটি মেসেজ সম্পর্কে আরও তথ্যের জন্য HWASan রিপোর্ট বোঝা দেখুন।
কমান্ড-লাইন এক্সিকিউটেবল তৈরি করা
আপনি Android 14 ও এর পরের যেকোনও ভার্সনে HWASan-এর সাথে ইন্সট্রুমেন্ট করা এক্সিকিউটেবল তৈরি ও রান করতে পারবেন। আপনার এক্সিকিউটেবলের জন্য ndk-build বা CMake-এর জন্য বিল্ড-এ বর্ণিত একই কনফিগারেশন ব্যবহার করতে পারেন। Android 14 বা তার পরবর্তী যেকোনও ভার্সনে চলছে এমন ডিভাইসে এক্সিকিউটেবল পুশ করুন এবং শেল ব্যবহার করে এটি স্বাভাবিকভাবে চালান।
আপনি libc++ ব্যবহার করলে, নিশ্চিত করুন যে আপনি শেয়ার করা STL ব্যবহার করছেন এবং এটি ডিভাইসে পুশ করুন এবং আপনার বাইনারি চালানোর সময়
LD_LIBRARY_PATH-কে সেই ডিরেক্টরি হিসেবে সেট করুন যেখানে এটি আছে।
আপনি Gradle ব্যবহার না করলে, CMake ও ndk-build-এর সাহায্যে কমান্ড লাইন থেকে কীভাবে বিল্ড করতে হয় তা জানতে NDK ডকুমেন্টেশন দেখুন।
Android 13 বা এর আগের যেকোনও ভার্সন: সেট-আপ
আপনার ডিভাইসে Android 14 বা তার পরের যেকোনও ভার্সন থাকলে, আপনি এই ধাপটি এড়িয়ে যেতে পারেন এবং বিল্ড বিভাগে দেওয়া wrap.sh ব্যবহার করার নির্দেশাবলী অনুসরণ করতে পারেন। এছাড়াও, আপনি এই বিভাগটি অনুসরণ করতে এবং wrap.sh ব্যবহার করার নির্দেশাবলী এড়িয়ে যেতে পারেন।
Android 14-এর আগে, HWASan অ্যাপ্লিকেশন চালানোর জন্য Android-এর HWASan বিল্ড প্রয়োজন। আপনি উপযুক্ত Pixel ডিভাইসে আগে থেকে তৈরি HWASan ইমেজ ফ্ল্যাশ করতে পারবেন। বিল্ডগুলি ci.android.com-এ উপলভ্য, যেখানে আপনি ফ্ল্যাশ বিল্ড লিঙ্ক পেতে চান এমন সঠিক বিল্ডের জন্য বর্গক্ষেত্রে ক্লিক করতে পারেন। এর জন্য আপনাকে আপনার ফোনের কোডনেম জানতে হবে।
এর পরিবর্তে সরাসরি flash.android.com লিঙ্কে যাওয়া আরও সহজ হতে পারে কারণ সেখানে ফ্লো শুরু হয় আপনার ডিভাইস শনাক্ত করার মাধ্যমে এবং আপনি ব্যবহার করতে পারবেন এমন বিল্ডই শুধু আপনাকে দেখানো হয়। এই টুলে সেট-আপ ফ্লো সম্পর্কে নিম্নলিখিত ছবিতে ব্যাখ্যা করা হয়েছে।
আপনার ডিভাইসে ডেভেলপার মোড চালু করুন এবং USB কেবেল ব্যবহার করে এটি আপনার কম্পিউটারের সাথে কানেক্ট করুন। নতুন ডিভাইস যোগ করুন বিকল্পে ক্লিক করুন, ডায়ালগ থেকে আপনার ডিভাইস বেছে নিন এবং কানেক্ট করুন বিকল্পে ক্লিক করুন।
আপনার ডিভাইস কানেক্ট হয়ে গেলে, বিল্ড কনফিগার করতে সেটিতে ক্লিক করুন।
বিল্ড আইডি বেছে নিন বক্সে, aosp-master-with-phones-throttled
শাখা বেছে নিন যাতে আপনার কানেক্ট করা ডিভাইসের জন্য সঠিক ছবি অটোমেটিক বেছে নেওয়া যায়।
আপনার ডিভাইস ফ্ল্যাশ করতে ইনস্টল করুন বিকল্পে ক্লিক করুন।
প্রয়োজনীয় সেট-আপ সম্পর্কে আরও তথ্য Android Flash Tool ডকুমেন্টেশন থেকে পাবেন। অথবা, সোর্স থেকে HWASan ইমেজ তৈরি করার নির্দেশাবলীর জন্য আপনি AOSP ডকুমেন্টেশন চেক করতে পারেন।