Strace की मदद से, यह देखा जा सकता है कि कोई प्रोसेस कौनसी सिस्टम कॉल करती है और वे सिस्टम कॉल क्या दिखाते हैं.
स्ट्रेस बनाएं
strace को बनाने के लिए, यह कमांड चलाएं:
mmma -j6 external/strace
चल रही प्रोसेस में अटैच करें
strace का इस्तेमाल करने का सबसे आसान और आम तरीका यह है कि इसे किसी चल रही प्रोसेस से अटैच किया जाए. इसके लिए, ये काम किए जा सकते हैं:
adb shell strace -f -p PID
-f
फ़्लैग, स्ट्रेस को बताता है कि
साथ ही, बाद में नए थ्रेड बनेंगे.
आम तौर पर, कोई प्रोसेस बहुत सारे सिस्टम कॉल करती है. इसलिए, आपको सिर्फ़ वही डेटा इकट्ठा करने का तरीका जानने के लिए, strace मैन पेज पर जाना होगा जिसमें आपकी दिलचस्पी है.
किसी ऐप्लिकेशन पर इस्तेमाल करना
किसी ऐप्लिकेशन पर स्ट्रेस का इस्तेमाल करने के लिए:
- डिवाइस को सेट अप करें, ताकि तनाव की स्थिति का पता लगाया जा सके. आपको रूट होना होगा, SELinux को बंद करना होगा, और रनटाइम को रीस्टार्ट करना होगा, ताकि seccomp फ़िल्टर को हटाया जा सके. ऐसा न करने पर, strace नहीं चलेगा:
adb root
adb shell setenforce 0
adb shell stop
adb shell start
- strace लॉग के लिए, ऐसी डायरेक्ट्री सेट अप करें जिस पर सभी लोग लिख सकें. ऐसा इसलिए, क्योंकि strace, ऐप्लिकेशन के uid के तहत चलेगी:
adb shell mkdir -m 777 /data/local/tmp/strace
- उसे ट्रेस करने और लॉन्च करने की प्रक्रिया चुनें:
adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'
- प्रोसेस को सामान्य तरीके से लॉन्च करें.
ज़ाइगोट पर इस्तेमाल करना
zygote पर strace का इस्तेमाल करने के लिए, काम की init.rc
zygote
लाइन को ठीक करें (adb shell setenforce 0
की ज़रूरत है):
cd system/core/
patch -p1 <<EOF --- a/rootdir/init.zygote32.rc +++ b/rootdir/init.zygote32.rc @@ -1,4 +1,4 @@ -service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server +service zygote /system/bin/strace -o /data/local/tmp/zygote.strace /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server class main socket zygote stream 660 root system onrestart write /sys/android_power/request_state wake EOF
Android के बूट होने के दौरान strace लॉग पाना
Android बूट के दौरान स्ट्रेस लॉग पाने के लिए, ये बदलाव करें:
- प्रोसेस का नाम
zygote
से बदलकर हो गया हैstrace
, हो सकता है कि उपलब्ध न होने की वजह से दी गई सेवा शुरू न होstrace
के लिए SELinuxfile_context
. इसका समाधान है किsystem/sepolicy/private/file_contexts
में स्ट्रेस के लिए एक नई लाइन जोड़ें और मूल फ़ाइल के कॉन्टेक्स्ट को कॉपी करें. उदाहरण:/dev/socket/zygote u:object_r:zygote_socket:s0 + /system/bin/strace u:object_r:zygote_socket:s0
- kernel या bootconfig पैरामीटर जोड़ें. इसके बाद, डिवाइस को SELinux के अनुमति वाले मोड में बूट करें. आप
androidboot.selinux=permissive
को इसे जोड़कर ऐसा करें Android मेंBOARD_KERNEL_CMDLINE
याBOARD_BOOTCONFIG
के लिए कर्नेल वर्शन 5.10 या इसके बाद के वर्शन के साथ 12. (यह वैरिएबलbuild/core/Makefile
में रीड-ओनली बन जाता है, लेकिन हमेशा के लिए होता है/device/*/BoardConfig
के तहत उपलब्ध है.)
इसमें Pixel (सेलफ़िश) डिवाइस के लिए उदाहरण:/device/google/marlin/sailfish/BoardConfig.mk
: बदलाव करने के बाद, बूट इमेज को बनाएं और फ़्लैश करें. इसके बाद, डिवाइस अनुमति वाले मोड में बूट होगा.- BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... +BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... androidboot.selinux=permissive