Google is committed to advancing racial equity for Black communities. See how.
This page was translated by the Cloud Translation API.
Switch to English

অ্যাড্রেস স্যানিটাইজার

অ্যাড্রেসস্যানিটাইজার (আসান) স্থানীয় কোডের মেমরি বাগগুলি সনাক্ত করার জন্য একটি দ্রুতগতি সম্পন্ন সরঞ্জাম।

আসান সনাক্ত করেছে:

  • স্ট্যাক এবং হিপ বাফার ওভারফ্লো / আন্ডারফ্লো
  • বিনামূল্যে গাদা ব্যবহার
  • সুযোগ বাইরে স্ট্যাক
  • ডাবল ফ্রি / বন্য মুক্ত

আসান 32-বিট এবং 64-বিট এআরএম, প্লাস x86 এবং x86-64 উভয়তেই চলে। আসানের সিপিইউ ওভারহেড মোটামুটি 2x, কোড আকারের ওভারহেড 50% এবং 2x এর মধ্যে হয় এবং একটি বৃহত মেমরি ওভারহেড (আপনার বরাদ্দের ধরণগুলির উপর নির্ভর করে তবে 2x এর ক্রমের উপর নির্ভর করে)।

অ্যান্ড্রয়েড 10 এবং এআরএসপি 64- তে এওএসপি মাস্টার শাখা হার্ডওয়্যার-এক্সেল্রেটেড আসান (এইচডাব্লুএএসএএন) সমর্থন করে , নিম্ন র‌্যামের ওভারহেড এবং সনাক্ত করা বাগের বৃহত পরিসরের একটি অনুরূপ সরঞ্জাম। আসান দ্বারা চিহ্নিত বাগগুলি ছাড়াও এইচডাব্লুএসএন রিটার্নের পরে স্ট্যাকের ব্যবহার সনাক্ত করে।

এইচডাব্লুএসএনের অনুরূপ সিপিইউ এবং কোড আকারের ওভারহেড রয়েছে তবে এটি অনেক ছোট র‌্যামের ওভারহেড (15%)। এইচডাব্লুএএসএএন নিরক্ষরবাদী। কেবলমাত্র 256 টি ট্যাগ মান রয়েছে, সুতরাং কোনও বাগ ত্রুটি না থাকার সম্ভাবনা 0.4% রয়েছে। ওভারফ্লোগুলি সনাক্ত করার জন্য এইচডাব্লুএসএনের সীমিত আকারের রেড জোন এবং বিনামূল্যে ব্যবহারের পরে বিনামূল্যে সনাক্তকরণের জন্য সীমিত-ক্ষমতার কোয়ারানটাইন নেই, সুতরাং এইচডাব্লুএসএনের বিষয়টি বিবেচ্য নয় যে ওভারফ্লো কত বড় বা স্মৃতিটি কতক্ষণ আগে অবনমিত হয়েছিল। এটি এইচডাব্লিউএসানকে আসনের চেয়ে ভাল করে তোলে। আপনি এইচডাব্লুএসএনের ডিজাইন বা অ্যান্ড্রয়েডে এইচডাব্লিউএসএন ব্যবহার সম্পর্কে আরও পড়তে পারেন।

আসান হিপ ওভারফ্লোগুলি ছাড়াও স্ট্যাক / গ্লোবাল ওভারফ্লোগুলি সনাক্ত করে এবং ন্যূনতম মেমরির ওভারহেড সহ দ্রুত।

এই দস্তাবেজটিতে অসানের সাথে কীভাবে / সমস্ত Android এর অংশগুলি তৈরি এবং চালানো যায় তা বর্ণনা করে। যদি আপনি আসনের সাথে একটি এসডিকে / এনডিকে অ্যাপ তৈরি করে থাকেন তবে পরিবর্তে ঠিকানা স্যানিটাইজারটি দেখুন।

আসনের সাথে স্বতন্ত্র এক্সিকিউটেবলকে স্যানিটাইজ করা

এক্সিকিউটেবলের জন্য বিল্ড LOCAL_SANITIZE:=address বা sanitize: { address: true } Add যুক্ত করুন। আপনি বিদ্যমান উদাহরণগুলির জন্য বা অন্যান্য উপলব্ধ স্যানিটাইজারগুলি খুঁজে পেতে কোডটি অনুসন্ধান করতে পারেন।

কোনও বাগ সনাক্ত হওয়ার পরে, আসান একটি স্ট্রোবস প্রতিবেদন স্ট্যান্ডার্ড আউটপুট এবং logcat উভয় প্রিন্ট করে এবং প্রক্রিয়াটি ক্র্যাশ করে।

আসনের সাথে ভাগ করে নেওয়া লাইব্রেরি স্যানিটাইজিং

আসান যেভাবে কাজ করে তার কারণে, আসনের সাথে নির্মিত একটি লাইব্রেরি কেবল আসনের সাথে নির্মিত নির্বাহী দ্বারা ব্যবহার করা যেতে পারে।

একাধিক এক্সিকিউটেবলগুলিতে ব্যবহৃত একটি ভাগ করা লাইব্রেরি স্যানিটাইজ করতে, সমস্ত কিছুই আসানের সাথে নির্মিত নয়, আপনার লাইব্রেরির দুটি কপি দরকার need এটি করার প্রস্তাবিত উপায় হ'ল প্রশ্নের মধ্যে থাকা মডিউলটির জন্য Android.mk এ নিম্নলিখিতগুলি যুক্ত করা:

LOCAL_SANITIZE:=address
LOCAL_MODULE_RELATIVE_PATH := asan

এটি লাইব্রেরিটিকে /system/lib/asan /system/lib পরিবর্তে রাখে। তারপরে, আপনার এক্সিকিউটেবলটি এটি দিয়ে চালান:

LD_LIBRARY_PATH=/system/lib/asan

সিস্টেম /init.rc জন্য, /init.rc বা /init.$device$.rc এর উপযুক্ত বিভাগে নিম্নলিখিতটি যুক্ত করুন।

setenv LD_LIBRARY_PATH /system/lib/asan

প্রক্রিয়াটি /proc/$PID/maps পড়ার সময় উপস্থিত /system/lib/asan থেকে লাইব্রেরি ব্যবহার করছে তা যাচাই করুন। যদি এটি না হয় তবে আপনার সেলিলাক্স অক্ষম করতে হবে:

adb root
adb shell setenforce 0
# restart the process with adb shell kill $PID
# if it is a system service, or may be adb shell stop; adb shell start.

ভাল স্ট্যাক ট্রেস

প্রোগ্রামে প্রতিটি মেমরি বরাদ্দ এবং ডিএলোকেশন ইভেন্টের জন্য স্ট্যাক ট্রেস রেকর্ড করতে আসান একটি দ্রুত, ফ্রেম-পয়েন্টার-ভিত্তিক আনওয়িন্দার ব্যবহার করে। Android এর বেশিরভাগটি ফ্রেম পয়েন্টার ছাড়াই নির্মিত without ফলস্বরূপ, আপনি প্রায়শই একটি বা দুটি অর্থবোধক ফ্রেম পান। এটি ঠিক করার জন্য, হয় আসান (প্রস্তাবিত!) দিয়ে লাইব্রেরিটি পুনর্নির্মাণ করুন বা এর সাথে:

LOCAL_CFLAGS:=-fno-omit-frame-pointer
LOCAL_ARM_MODE:=arm

বা প্রক্রিয়া পরিবেশে ASAN_OPTIONS=fast_unwind_on_malloc=0 সেট করুন। পরবর্তীটি লোডের উপর নির্ভর করে খুব সিপিইউ-নিবিড় হতে পারে।

প্রতীকীকরণ

প্রাথমিকভাবে, আসনের প্রতিবেদনে বাইনারি এবং ভাগ করা লাইব্রেরিগুলির অফসেটগুলির উল্লেখ রয়েছে। উত্স ফাইল এবং লাইন তথ্য প্রাপ্তির দুটি উপায় রয়েছে:

  • নিশ্চিত করুন যে llvm-symbolizer বাইনারি /system/bin উপস্থিত রয়েছে। llvm-symbolizer মধ্যে উত্স থেকে নির্মিত হয় third_party/llvm/tools/llvm-symbolizer
  • external/compiler-rt/lib/asan/scripts/symbolize.py স্ক্রিপ্টের মাধ্যমে প্রতিবেদনটি ফিল্টার করুন।

হোস্টে প্রতীকী লাইব্রেরিগুলির প্রাপ্যতার কারণে দ্বিতীয় পদ্ধতিটি আরও ডেটা সরবরাহ করতে পারে (যা file:line অবস্থান)।

অ্যাপস এ আসান

আসান জাভা কোডটি দেখতে পাচ্ছে না তবে এটি জেএনআই লাইব্রেরিতে বাগগুলি সনাক্ত করতে পারে detect তার জন্য, আপনাকে আসান দিয়ে এক্সিকিউটেবল তৈরি করতে হবে, যা এই ক্ষেত্রে /system/bin/app_process( 32|64 ) । এটি একই সাথে ডিভাইসের সমস্ত অ্যাপ্লিকেশনগুলিতে আসানকে সক্ষম করে, যা একটি ভারী বোঝা, তবে 2 জিবি র‌্যামযুক্ত কোনও ডিভাইস এটি পরিচালনা করতে সক্ষম হবে।

frameworks/base/cmds/app_process app_process বিল্ড app_process LOCAL_SANITIZE:=address frameworks/base/cmds/app_process । আপাতত একই ফাইলে app_process__asan উপেক্ষা করুন (এটি পড়ার সময় যদি এখনও থাকে তবে)।

সম্পাদনা করুন service zygote উপযুক্ত বিভাগে system/core/rootdir/init.zygote( 32|64 ).rc ইন্ডেন্টযুক্ত লাইন ধারণকারী ব্লক করার জন্য নিম্নলিখিত লাইন যোগ করার জন্য ফাইল class main , একই পরিমাণ দ্বারা ইন্ডেন্টযুক্ত:

    setenv LD_LIBRARY_PATH /system/lib/asan:/system/lib
    setenv ASAN_OPTIONS allow_user_segv_handler=true

বিল্ড, অ্যাডাব সিঙ্ক, দ্রুত বুট ফ্ল্যাশ বুট এবং পুনরায় বুট করুন।

মোড়ানো সম্পত্তি ব্যবহার করে

পূর্ববর্তী বিভাগে পদ্ধতির মাধ্যমে আসানকে সিস্টেমের প্রতিটি অ্যাপ্লিকেশন (প্রকৃতপক্ষে জাইগোট প্রক্রিয়াটির প্রতিটি বংশধরের মধ্যে) রাখে। ধীর অ্যাপ্লিকেশন প্রারম্ভের জন্য কিছু মেমরি ওভারহেড ট্রেড করে আসনের সাথে কেবল একটি (বা কয়েকটি) অ্যাপ্লিকেশন চালানো সম্ভব।

wrap. দিয়ে আপনার অ্যাপ্লিকেশন শুরু করে এটি করা যেতে পারে wrap. সম্পত্তি নিম্নলিখিত উদাহরণটি আসনের অধীনে জিমেইল অ্যাপ চালায়:

adb root
adb shell setenforce 0  # disable SELinux
adb shell setprop wrap.com.google.android.gm "asanwrapper"

এই প্রসঙ্গে, asanwrapper /system/bin/app_process থেকে /system/bin/asan/app_process , যা আসান দিয়ে নির্মিত। এটি গতিশীল লাইব্রেরি অনুসন্ধানের পথের শুরুতে /system/lib/asan করে। এই পদ্ধতিতে /system/lib/asan আসনের আসান-চালিত লাইব্রেরিগুলি asanwrapper দিয়ে asanwrapper সময় /system/lib সাধারণ লাইব্রেরিগুলিতে পছন্দ করা হয়।

কোনও বাগ পাওয়া গেলে, অ্যাপটি ক্র্যাশ হয়ে যায় এবং লগটিতে প্রতিবেদনটি মুদ্রিত হয়।

সানিটিজলট্রাগেট

অ্যান্ড্রয়েড .0.০ এবং উচ্চতর একসাথে আসনের সাথে পুরো অ্যান্ড্রয়েড প্ল্যাটফর্ম তৈরির জন্য সমর্থন অন্তর্ভুক্ত করে। (যদি আপনি অ্যান্ড্রয়েড 9 এর চেয়ে বেশি রিলিজ তৈরি করে থাকেন তবে এইচডাব্লিউএসএন আরও ভাল পছন্দ))

একই বিল্ড ট্রিতে নিম্নলিখিত কমান্ডগুলি চালান।

make -j42
SANITIZE_TARGET=address make -j42

এই মোডে, userdata.img অতিরিক্ত লাইব্রেরি রয়েছে এবং এছাড়াও ডিভাইসে ফ্ল্যাশ করা আবশ্যক। নিম্নলিখিত কমান্ড লাইনটি ব্যবহার করুন:

fastboot flash userdata && fastboot flashall

এটি ভাগ করা লাইব্রেরির দুটি সেট তৈরি করে: সাধারণত /system/lib লাইব (প্রথম অনুরোধ করুন), এবং /data/asan/lib লিবিতে আসান-চালিত (দ্বিতীয়বার অনুরোধ)। দ্বিতীয় বিল্ড থেকে এক্সিকিউটেবলগুলি প্রথম বিল্ড থেকে ওভাররাইট করে। Asan-instrumented এক্সেকিউটেবল একটি ভিন্ন লাইব্রেরির অনুসন্ধানের পাথ যে অন্তর্ভুক্ত পেতে /data/asan/lib সামনে /system/lib ব্যবহারের মাধ্যমে /system/bin/linker_asan মধ্যে PT_INTERP

বিল্ড সিস্টেম ক্লোবার্স ইন্টারমিডিয়েট অবজেক্ট ডিরেক্টরিগুলি যখন AN $SANITIZE_TARGET মান পরিবর্তন হয়। এটি /system/lib ইনস্টল করা বাইনারিগুলি ইনস্টল করার সময় সমস্ত লক্ষ্যগুলি পুনর্নির্মাণকে বাধ্য করে।

কিছু লক্ষ্য আসান দিয়ে তৈরি করা যায় না:

  • স্ট্যাটিকালি লিঙ্কযুক্ত এক্সিকিউটেবল
  • LOCAL_CLANG:=false লক্ষ্যমাত্রা
  • LOCAL_SANITIZE:=false SANITIZE_TARGET=address জন্য অসান নয়

এগুলির মতো এক্সিকিউটেবলগুলি SANITIZE_TARGET বিল্ডে এড়ানো যায় এবং প্রথম তৈরির SANITIZE_TARGET সংস্করণটি /system/bin রেখে যায়।

এর মতো লাইব্রেরিগুলি আসান ছাড়াই নির্মিত। তারা স্ট্যাটিক লাইব্রেরিগুলির উপর নির্ভর করে যা কিছু তাদের উপর নির্ভর করে।

সমর্থন ডকুমেন্টেশন