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