स्ट्रेस का उपयोग करना

स्ट्रेस आपको यह देखने में सक्षम बनाता है कि एक प्रक्रिया किस सिस्टम कॉल को करती है और वे सिस्टम कॉल क्या लौटाते हैं।

बिल्डिंग स्ट्रेस

स्ट्रेस बनाने के लिए, निम्नलिखित चलाएँ:

mmma -j6 external/strace

चल रही प्रक्रिया से जुड़ना

स्ट्रेस के लिए सबसे सरल और सबसे आम उपयोग का मामला इसे एक चल रही प्रक्रिया से जोड़ना है, जिसे आप इसके साथ कर सकते हैं:

adb shell strace -f -p PID

-f ध्वज स्ट्रेस को प्रक्रिया में सभी थ्रेड्स के साथ-साथ बाद में उत्पन्न होने वाले किसी भी नए थ्रेड से जुड़ने के लिए कहता है।

एक सामान्य प्रक्रिया बहुत सारे सिस्टम कॉल करती है, इसलिए आप यह जानने के लिए स्ट्रेस मैन पेज की समीक्षा करना चाहेंगे कि केवल उस डेटा को कैसे एकत्र किया जाए जिसमें आप वास्तव में रुचि रखते हैं।

किसी एप्लिकेशन पर उपयोग करना

किसी एप्लिकेशन पर स्ट्रेस का उपयोग करने के लिए:

  1. डिवाइस सेट करें ताकि आप स्ट्रेस चला सकें। आपको रूट होने की आवश्यकता है, SELinux को अक्षम करें, और seccomp फ़िल्टर को हटाने के लिए रनटाइम को पुनरारंभ करें जो अन्यथा स्ट्रेस को चलने से रोक देगा:
    adb root
    adb shell setenforce 0
    adb shell stop
    adb shell start
    
  2. स्ट्रेस लॉग के लिए एक विश्व-लेखन योग्य निर्देशिका सेट करें, क्योंकि स्ट्रेस ऐप के यूआईडी के तहत चलेगा:
    adb shell mkdir -m 777 /data/local/tmp/strace
    
  3. इसे ट्रेस करने और लॉन्च करने की प्रक्रिया चुनें:
    adb shell setprop wrap.com.android.calendar '"logwrapper strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'
    
  4. प्रक्रिया को सामान्य रूप से लॉन्च करें.

युग्मनज पर प्रयोग

जाइगोट पर स्ट्रेस का उपयोग करने के लिए, प्रासंगिक init.rc जाइगोट लाइन को ठीक करें ( 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

एंड्रॉइड बूट के दौरान स्ट्रेस लॉग प्राप्त करना

एंड्रॉइड बूट के दौरान स्ट्रेस लॉग प्राप्त करने के लिए, निम्नलिखित परिवर्तन करें:

  • चूंकि प्रक्रिया का नाम zygote से strace में बदल जाता है, इसलिए strace के लिए SELinux file_context गुम होने के कारण दी गई सेवा प्रारंभ होने में विफल हो सकती है। समाधान यह है कि system/sepolicy/private/file_contexts में स्ट्रेस के लिए एक नई लाइन जोड़ी जाए और मूल फ़ाइल संदर्भ को कॉपी किया जाए। उदाहरण:
    /dev/socket/zygote      u:object_r:zygote_socket:s0
    + /system/bin/strace u:object_r:zygote_socket:s0
    
  • कर्नेल या बूटकॉन्फ़िग पैरामीटर जोड़ें, फिर डिवाइस को SELinux अनुमेय मोड में बूट करें। आप इसे androidboot.selinux=permissive को BOARD_KERNEL_CMDLINE , या BOARD_BOOTCONFIG में Android 12 में कर्नेल संस्करण 5.10 या इससे अधिक के साथ जोड़कर कर सकते हैं। (यह वेरिएबल build/core/Makefile में केवल पढ़ने के लिए बन जाता है लेकिन हमेशा /device/*/BoardConfig के अंतर्गत उपलब्ध होता है।)

    /device/google/marlin/sailfish/BoardConfig.mk में पिक्सेल (सेलफ़िश) डिवाइस के लिए उदाहरण:
    - BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...
    +BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...  androidboot.selinux=permissive
    
    परिवर्तन करने के बाद, बूट छवि बनाएं और फ्लैश करें और डिवाइस अनुमेय मोड में बूट हो जाएगा।