Android NDK, HWAddress Sanitizer के साथ काम करता है. इसे HWASan के नाम से भी जाना जाता है, जो एनडीके r21 और Android 10 (एपीआई लेवल 29) के साथ. HWASan सिर्फ़ 64-बिट पर उपलब्ध है डिवाइसों को चालू करें.
HWASan, Aसैन की तरह ही एक मेमोरी की गड़बड़ी का पता लगाने वाला टूल है. क्लासिक स्टेज की तुलना में ASan, HWASan के साथ:
- मिलता-जुलता सीपीयू ओवरहेड (~2x)
- मिलता-जुलता कोड साइज़ ओवरहेड (40 – 50%)
- बहुत कम रैम ओवरहेड (10% – 35%)
HWASan, गड़बड़ी के उन सेट का पता लगाता है जो ASan के जैसे हैं:
- स्टैक और हीप बफ़र ओवरफ़्लो या अंडरफ़्लो
- मुफ़्त के बाद हीप का इस्तेमाल
- स्टैक का बाहरी दायरा इस्तेमाल करें
- डबल फ़्री या वाइल्ड फ़्री
इसके अलावा, HWASan इन चीज़ों का भी पता लगाता है:
- रिटर्न के बाद स्टैक का इस्तेमाल
Sample App
ऐप्लिकेशन का नमूना इसमें, बिल्ड वैरिएंट को कॉन्फ़िगर करने का तरीका दिखाया गया है ह्वासन.
बनाएं
HWAddress Sanitizer की मदद से अपने ऐप्लिकेशन का नेटिव (जेएनआई) कोड बनाने के लिए, यह करें फ़ॉलो किया जा रहा है:
एनडीके-बिल्ड
आपकी 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)
एनडीके 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 या उसके बाद का वर्शन है, तो किसी भी कंप्यूटर पर, डीबग करने लायक ऐप्लिकेशन चलाने के लिए, wrap.sh script Android-पावर्ड डिवाइस. अगर आपने चरणों का पालन करना चुना है, तो आप इस चरण को छोड़ सकते हैं सेटअप के निर्देश में जाएं.
दिए गए निर्देशों का पालन करके
फ़ाइल को जोड़ने के लिए, wrap.sh स्क्रिप्ट को पैक करें
arm64-v8a
के लिए wrap.sh स्क्रिप्ट फ़ॉलो कर रहा है.
#!/system/bin/sh
LD_HWASAN=1 exec "$@"
चलाएं
अगर Android 14 से पुराना वर्शन इस्तेमाल किया जा रहा है या इसमें 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)
इस संदेश के बाद अतिरिक्त डीबगिंग जानकारी हो सकती है, जिसमें यह शामिल है ऐप्लिकेशन में लाइव थ्रेड की सूची, आस-पास की मेमोरी के लिए असाइन किए गए टैग और सीपीयू रजिस्टर वैल्यू.
HWASan की गड़बड़ी के बारे में ज़्यादा जानने के लिए, HWASan रिपोर्ट को समझना देखें मैसेज.
कमांड-लाइन एक्ज़ीक्यूटेबल बनाया जा रहा है
HWASan से, Android 14 और नया. उसी कॉन्फ़िगरेशन का इस्तेमाल किया जा सकता है जिसका इस्तेमाल, बिल्ड में बताया गया है ndk-build या CMake का इस्तेमाल करें. एक्ज़ीक्यूटेबल को किसी डिवाइस पर पुश करें Android 14 या इसके बाद के वर्शन पर काम कर रहा हो और शेल का इस्तेमाल करके इसे सामान्य तरीके से चला सकता हो.
अगर libc++ का इस्तेमाल किया जा रहा है, तो पक्का करें कि शेयर किए गए STL का इस्तेमाल किया जा रहा हो. इसके बाद, इसे
डिवाइस को सेव करेगा और LD_LIBRARY_PATH
को उसकी डायरेक्ट्री पर सेट कर देगा. ऐसा तब होगा, जब
आपकी बाइनरी फ़ाइल चला रहा है.
अगर Gradle का इस्तेमाल नहीं किया जा रहा है, तो एनडीके (NDK) दस्तावेज़ देखें और जानें कि कैसे कमांड लाइन बनाने के लिए, CMake और ndk-build.
Android 13 या उससे पहले के वर्शन के लिए: सेटअप
अगर आपके डिवाइस में Android 14 या उसके बाद का वर्शन है, तो इस चरण को छोड़ा जा सकता है. नीचे दिए गए बिल्ड सेक्शन में, wrap.sh इस्तेमाल करने के निर्देश दिए गए हैं. इस सेक्शन में दिए गए निर्देशों को भी फ़ॉलो किया जा सकता है. नीचे रैप करें.
Android 14 से पहले के वर्शन वाले HWASan ऐप्लिकेशन को चलाने के लिए, HWASan के Android वर्शन की ज़रूरत होती है. इस सुविधा के साथ काम करने वाले Pixel डिवाइसों पर, पहले से बनी HWASan इमेज को फ़्लैश किया जा सकता है. बिल्ड ci.android.com पर उपलब्ध है, जहां आप ठीक वही बिल्ड, जिसे आप फ़्लैश बिल्ड लिंक पाना चाहते हैं. इसके लिए आपको यह जानकारी होनी चाहिए आपके फ़ोन का कोडनेम.
इसके बजाय सीधे flash.android.com पर जाना आसान हो सकता है, क्योंकि वहां फ़्लो शुरू होता है, ताकि डिवाइस का पता लगाया जा सके. साथ ही, आपको सिर्फ़ ऐसे बिल्ड दिखते हैं जिनका इस्तेमाल किया जा सकता है. इन इमेज में, इस टूल के सेटअप का तरीका दिखाया गया है.
अपने डिवाइस पर डेवलपर मोड चालू करें और इसका इस्तेमाल करके इसे अपने कंप्यूटर से कनेक्ट करें शामिल है. नया डिवाइस जोड़ें पर क्लिक करें. इसके बाद, डायलॉग बॉक्स से अपना डिवाइस चुनें और कनेक्ट करें पर क्लिक करें.
डिवाइस कनेक्ट हो जाने के बाद, बिल्ड को कॉन्फ़िगर करने के लिए उस पर क्लिक करें.
बिल्ड आईडी चुनें बॉक्स में, aosp-master-with-phones-throttled
चुनें
आपके पास जो डिवाइस है उसके लिए सही इमेज अपने-आप चुनने के लिए ब्रांच
कनेक्ट किया गया.
अपने डिवाइस को फ़्लैश करने के लिए इंस्टॉल करें पर क्लिक करें.
ज़रूरी सेट अप के बारे में ज़्यादा जानकारी Android Flash टूल से जुड़े दस्तावेज़. इसके अलावा, आपके पास सोर्स से HWASan इमेज बनाने के निर्देशों के लिए, AOSP दस्तावेज़.