strace का इस्तेमाल करना

Strace की मदद से, यह देखा जा सकता है कि कोई प्रोसेस कौनसी सिस्टम कॉल करती है और वे सिस्टम कॉल क्या दिखाते हैं.

स्ट्रेस बनाएं

strace को बनाने के लिए, यह कमांड चलाएं:

mmma -j6 external/strace

चल रही प्रोसेस में अटैच करें

strace का इस्तेमाल करने का सबसे आसान और आम तरीका यह है कि इसे किसी चल रही प्रोसेस से अटैच किया जाए. इसके लिए, ये काम किए जा सकते हैं:

adb shell strace -f -p PID

-f फ़्लैग, स्ट्रेस को बताता है कि साथ ही, बाद में नए थ्रेड बनेंगे.

आम तौर पर, कोई प्रोसेस बहुत सारे सिस्टम कॉल करती है. इसलिए, आपको सिर्फ़ वही डेटा इकट्ठा करने का तरीका जानने के लिए, strace मैन पेज पर जाना होगा जिसमें आपकी दिलचस्पी है.

किसी ऐप्लिकेशन पर इस्तेमाल करना

किसी ऐप्लिकेशन पर स्ट्रेस का इस्तेमाल करने के लिए:

  1. डिवाइस को सेट अप करें, ताकि तनाव की स्थिति का पता लगाया जा सके. आपको रूट होना होगा, SELinux को बंद करना होगा, और रनटाइम को रीस्टार्ट करना होगा, ताकि seccomp फ़िल्टर को हटाया जा सके. ऐसा न करने पर, strace नहीं चलेगा:
    adb root
    adb shell setenforce 0
    adb shell stop
    adb shell start
    
  2. strace लॉग के लिए, ऐसी डायरेक्ट्री सेट अप करें जिस पर सभी लोग लिख सकें. ऐसा इसलिए, क्योंकि strace, ऐप्लिकेशन के uid के तहत चलेगी:
    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. प्रोसेस को सामान्य तरीके से लॉन्च करें.

ज़ाइगोट पर इस्तेमाल करना

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 के लिए 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
    
  • 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
    
    बदलाव करने के बाद, बूट इमेज को बनाएं और फ़्लैश करें. इसके बाद, डिवाइस अनुमति वाले मोड में बूट होगा.