aboutsummaryrefslogtreecommitdiff
path: root/en/devices/tech/debug/strace.html
diff options
context:
space:
mode:
Diffstat (limited to 'en/devices/tech/debug/strace.html')
-rw-r--r--en/devices/tech/debug/strace.html121
1 files changed, 121 insertions, 0 deletions
diff --git a/en/devices/tech/debug/strace.html b/en/devices/tech/debug/strace.html
new file mode 100644
index 00000000..a69a64b4
--- /dev/null
+++ b/en/devices/tech/debug/strace.html
@@ -0,0 +1,121 @@
+<html devsite>
+ <head>
+ <title>Using Strace</title>
+ <meta name="project_path" value="/_project.yaml" />
+ <meta name="book_path" value="/_book.yaml" />
+ </head>
+ <body>
+ <!--
+ Copyright 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<p><a href="https://strace.io">Strace</a> enables you to see the system calls a
+process makes and what those system calls return. A typical process makes a lot
+of system calls, so you'll want to review the
+<a href="http://man7.org/linux/man-pages/man1/strace.1.html">strace man page</a>
+to learn how to collect only data you're actually interested in.</p>
+
+<h2 id=build-strace>Building strace</h2>
+
+<p>To build strace, run the following:
+<pre>
+$ mmma -j6 external/strace
+</pre>
+
+<h2 id=attach-strace>Attaching to a running process</h2>
+
+<p>The simplest and most common use case for strace is to attach it to a running
+process, which you can do with:</p>
+<pre>
+$ adb shell strace -f -p PID
+</pre>
+<p>The <code>-f</code> flag tells strace to attach to all the threads in the
+process, plus any new threads spawned later.</p>
+
+<h2 id=app-strace>Using on an application</h2>
+<p>To use strace on an application:</p>
+
+<ol>
+<li>Set up a directory for strace logs:
+<pre>
+$ adb shell setenforce 0
+$ adb shell mkdir /data/local/tmp/strace
+$ adb shell chmod 777 /data/local/tmp/strace
+</pre>
+</li>
+
+<li>Choose the process to trace before launching it:
+<pre>
+$ adb shell setprop wrap.com.google.android.browser "logwrapper strace -f -o /data/local/tmp/strace/strace.com.google.android.browser.txt"
+</pre>
+</li>
+<li>Launch the process normally.</li>
+</ol>
+
+<h2 id=zygote-systrace>Using on the zygote</h2>
+<p>To use strace on the zygote, fix the relevant <code>init.rc</code> zygote
+line (requires <code>adb shell setenforce 0</code>):
+</p>
+
+<pre>
+$ cd system/core/
+$ patch -p1 &lt;&lt;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/xbin/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
+</pre>
+
+<h2 id=get-logs-boot>Getting strace logs during Android boot</h2>
+
+<p>To get strace logs during Android boot, make the following changes:</p>
+
+<ul>
+<li>Since the process name changes from <code>zygote</code> to
+<code>strace</code>, the given service may fail to start due to the missing
+SELinux <code>file_context</code> for <code>strace</code>. The solution is to
+add a new line for strace in <code>system/sepolicy/private/file_contexts</code>
+and copy the original file context over. Example:
+<pre>
+/dev/socket/zygote u:object_r:zygote_socket:s0
++ /system/xbin/strace u:object_r:zygote_socket:s0
+</pre>
+</li>
+
+<li>Add kernel command, then boot the device in SELinux permissive mode. You can
+do this by adding <code>androidboot.selinux=permissive</code>to
+<code>BOARD_KERNEL_CMDLINE</code>. (This variable becomes read-only in
+<code>build/core/Makefile</code> but is always available under
+<code>/device/*/BoardConfig</code>.)
+
+<br>
+<br>Example for the Pixel (sailfish) device in
+<code>/device/google/marlin/sailfish/BoardConfig.mk</code>:
+<pre>
+- BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ...
++BOARD_KERNEL_CMDLINE := .... androidboot.hardware=sailfish ... androidboot.selinux=permissive
+</pre>
+After making the change, build and flash the boot image and the device will boot
+in permissive mode.
+</li>
+</ul>
+
+ </body>
+</html>