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

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

strace बनाना

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

mmma -j6 external/strace

चल रही प्रोसेस से अटैच करना

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

adb shell strace -f -p PID

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

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

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

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

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

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