Strace की मदद से, किसी प्रोसेस के सिस्टम कॉल और उन सिस्टम कॉल से मिलने वाले जवाबों को देखा जा सकता है.
strace बनाना
strace बनाने के लिए, यह कमांड चलाएं:
mmma -j6 external/strace
चल रही प्रोसेस से अटैच करना
strace का सबसे आसान और आम इस्तेमाल, इसे चालू प्रोसेस से अटैच करना है. इसके लिए, यह कमांड इस्तेमाल करें:
adb shell strace -f -p PID
-f
फ़्लैग, strace को प्रोसेस के सभी थ्रेड से अटैच होने के लिए कहता है. साथ ही, बाद में स्पॉन किए गए किसी भी नए थ्रेड से अटैच होने के लिए कहता है.
किसी सामान्य प्रोसेस में कई सिस्टम कॉल किए जाते हैं. इसलिए, आपको strace man पेज की समीक्षा करनी चाहिए. इससे आपको यह जानने में मदद मिलेगी कि सिर्फ़ वह डेटा कैसे इकट्ठा किया जाए जिसमें आपकी दिलचस्पी है.
किसी ऐप्लिकेशन पर इस्तेमाल करना
किसी ऐप्लिकेशन पर strace का इस्तेमाल करने के लिए:
- डिवाइस को सेट अप करें, ताकि strace चलाया जा सके. आपको रूट होना चाहिए. साथ ही, SELinux को बंद करना होगा और रनटाइम को रीस्टार्ट करना होगा, ताकि seccomp फ़िल्टर को हटाया जा सके. ऐसा न करने पर, strace नहीं चल पाएगा:
adb root
adb shell setenforce 0
adb shell stop
adb shell start
- strace लॉग के लिए, ऐसी डायरेक्ट्री सेट अप करें जिसमें सभी लोग लिख सकें. ऐसा इसलिए, क्योंकि strace ऐप्लिकेशन के यूआईडी के तहत चलेगा:
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 बूट के दौरान strace लॉग पाने के लिए, ये बदलाव करें:
- प्रोसेस का नाम
zygote
से बदलकरstrace
हो गया है. इसलिए,strace
के लिए SELinuxfile_context
मौजूद न होने की वजह से, दी गई सेवा शुरू नहीं हो सकती. इस समस्या को हल करने के लिए,system/sepolicy/private/file_contexts
में strace के लिए एक नई लाइन जोड़ें और मूल फ़ाइल के कॉन्टेक्स्ट को कॉपी करें. उदाहरण:/dev/socket/zygote u:object_r:zygote_socket:s0 + /system/bin/strace u:object_r:zygote_socket:s0
- कर्नल या बूटकॉन्फ़िग पैरामीटर जोड़ें. इसके बाद, डिवाइस को SELinux के नीति लागू न करने वाले मोड में बूट करें. इसके लिए, Android 12 में कर्नेल वर्शन 5.10 या इसके बाद के वर्शन के साथ
androidboot.selinux=permissive
कोBOARD_KERNEL_CMDLINE
याBOARD_BOOTCONFIG
में जोड़ा जा सकता है. (यह वैरिएबल,build/core/Makefile
में सिर्फ़ पढ़ने के लिए उपलब्ध होता है. हालांकि, यह/device/*/BoardConfig
में हमेशा उपलब्ध रहता है.)
/device/google/marlin/sailfish/BoardConfig.mk
में Pixel (sailfish) डिवाइस का उदाहरण: बदलाव करने के बाद, बूट इमेज बनाएं और उसे फ़्लैश करें. इसके बाद, डिवाइस अनुमतियों वाले मोड में बूट होगा.- BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... +BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... androidboot.selinux=permissive