xref: /aosp_15_r20/external/perfetto/docs/quickstart/callstack-sampling.md (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker# Quickstart: Callstack sampling on Android
2*6dbdd20aSAndroid Build Coastguard Worker
3*6dbdd20aSAndroid Build Coastguard Worker## Prerequisites
4*6dbdd20aSAndroid Build Coastguard Worker
5*6dbdd20aSAndroid Build Coastguard Worker- [ADB](https://developer.android.com/studio/command-line/adb) installed.
6*6dbdd20aSAndroid Build Coastguard Worker- A device running Android T+.
7*6dbdd20aSAndroid Build Coastguard Worker- Either a debuggable (`userdebug`/`eng`) Android image, or the apps to be
8*6dbdd20aSAndroid Build Coastguard Worker  profiled need to be
9*6dbdd20aSAndroid Build Coastguard Worker  [marked as profileable or debuggable](https://developer.android.com/guide/topics/manifest/profileable-element)
10*6dbdd20aSAndroid Build Coastguard Worker  in their manifests.
11*6dbdd20aSAndroid Build Coastguard Worker
12*6dbdd20aSAndroid Build Coastguard Worker## Capture a CPU profile
13*6dbdd20aSAndroid Build Coastguard Worker
14*6dbdd20aSAndroid Build Coastguard Worker### Linux or macOS
15*6dbdd20aSAndroid Build Coastguard Worker
16*6dbdd20aSAndroid Build Coastguard WorkerMake sure `adb` is installed and in your `PATH`.
17*6dbdd20aSAndroid Build Coastguard Worker
18*6dbdd20aSAndroid Build Coastguard Worker```bash
19*6dbdd20aSAndroid Build Coastguard Workeradb devices -l
20*6dbdd20aSAndroid Build Coastguard Worker```
21*6dbdd20aSAndroid Build Coastguard Worker
22*6dbdd20aSAndroid Build Coastguard WorkerIf more than one device or emulator is reported you must select one upfront as
23*6dbdd20aSAndroid Build Coastguard Workerfollows:
24*6dbdd20aSAndroid Build Coastguard Worker
25*6dbdd20aSAndroid Build Coastguard Worker```bash
26*6dbdd20aSAndroid Build Coastguard Workerexport ANDROID_SERIAL=SER123456
27*6dbdd20aSAndroid Build Coastguard Worker```
28*6dbdd20aSAndroid Build Coastguard Worker
29*6dbdd20aSAndroid Build Coastguard WorkerDownload `cpu_profile` (if you don't have a Perfetto checkout):
30*6dbdd20aSAndroid Build Coastguard Worker
31*6dbdd20aSAndroid Build Coastguard Worker```bash
32*6dbdd20aSAndroid Build Coastguard Workercurl -LO https://raw.githubusercontent.com/google/perfetto/main/tools/cpu_profile
33*6dbdd20aSAndroid Build Coastguard Workerchmod +x cpu_profile
34*6dbdd20aSAndroid Build Coastguard Worker```
35*6dbdd20aSAndroid Build Coastguard Worker
36*6dbdd20aSAndroid Build Coastguard WorkerThen, start profiling. For example, to profile the processes `com.android.foo`
37*6dbdd20aSAndroid Build Coastguard Workerand `com.android.bar`, use:
38*6dbdd20aSAndroid Build Coastguard Worker
39*6dbdd20aSAndroid Build Coastguard Worker```bash
40*6dbdd20aSAndroid Build Coastguard Worker./cpu_profile -n "com.android.foo,com.android.bar"
41*6dbdd20aSAndroid Build Coastguard Worker```
42*6dbdd20aSAndroid Build Coastguard Worker
43*6dbdd20aSAndroid Build Coastguard WorkerBy default, profiling runs until manually terminated manually. To set a specific
44*6dbdd20aSAndroid Build Coastguard Workerduration for recording (e.g. 30 seconds), use:
45*6dbdd20aSAndroid Build Coastguard Worker
46*6dbdd20aSAndroid Build Coastguard Worker```bash
47*6dbdd20aSAndroid Build Coastguard Worker./cpu_profile -n "com.android.foo,com.android.bar" -d 30000
48*6dbdd20aSAndroid Build Coastguard Worker```
49*6dbdd20aSAndroid Build Coastguard Worker
50*6dbdd20aSAndroid Build Coastguard WorkerTo change how frequently stack samples are recorded (e.g. 120 samples per
51*6dbdd20aSAndroid Build Coastguard Workersecond), set the `-f` argument:
52*6dbdd20aSAndroid Build Coastguard Worker
53*6dbdd20aSAndroid Build Coastguard Worker```bash
54*6dbdd20aSAndroid Build Coastguard Worker./cpu_profile -n "com.android.foo,com.android.bar" -f 120
55*6dbdd20aSAndroid Build Coastguard Worker```
56*6dbdd20aSAndroid Build Coastguard Worker
57*6dbdd20aSAndroid Build Coastguard WorkerYou can also pass in parts of the names of the processes you want to profile by
58*6dbdd20aSAndroid Build Coastguard Workerenabling `--partial-matching/-p`. This matches processes that are already
59*6dbdd20aSAndroid Build Coastguard Workerrunning when profiling is started. For instance, to profile the processes
60*6dbdd20aSAndroid Build Coastguard Worker`com.android.foo` and `com.android.bar`, run:
61*6dbdd20aSAndroid Build Coastguard Worker
62*6dbdd20aSAndroid Build Coastguard Worker```bash
63*6dbdd20aSAndroid Build Coastguard Worker./cpu_profile -n "foo,bar" -p
64*6dbdd20aSAndroid Build Coastguard Worker```
65*6dbdd20aSAndroid Build Coastguard Worker
66*6dbdd20aSAndroid Build Coastguard WorkerYou can also pass in a custom [Perfetto config](/docs/concepts/config.md), which
67*6dbdd20aSAndroid Build Coastguard Workeroverrides all of the options above, using the `-c` argument:
68*6dbdd20aSAndroid Build Coastguard Worker
69*6dbdd20aSAndroid Build Coastguard Worker```bash
70*6dbdd20aSAndroid Build Coastguard Worker./cpu_profile -c "path/to/perfetto.config"
71*6dbdd20aSAndroid Build Coastguard Worker```
72*6dbdd20aSAndroid Build Coastguard Worker
73*6dbdd20aSAndroid Build Coastguard WorkerTo change where profiles are output, use the `-o` argument:
74*6dbdd20aSAndroid Build Coastguard Worker
75*6dbdd20aSAndroid Build Coastguard Worker```bash
76*6dbdd20aSAndroid Build Coastguard Worker./cpu_profile -n "com.android.foo,com.android.bar" -o "path/to/output/directory"
77*6dbdd20aSAndroid Build Coastguard Worker```
78*6dbdd20aSAndroid Build Coastguard Worker
79*6dbdd20aSAndroid Build Coastguard Worker### Windows
80*6dbdd20aSAndroid Build Coastguard Worker
81*6dbdd20aSAndroid Build Coastguard WorkerMake sure that the downloaded `adb.exe` is in the `PATH`.
82*6dbdd20aSAndroid Build Coastguard Worker
83*6dbdd20aSAndroid Build Coastguard Worker```bash
84*6dbdd20aSAndroid Build Coastguard Workerset PATH=%PATH%;%USERPROFILE%\Downloads\platform-tools
85*6dbdd20aSAndroid Build Coastguard Worker
86*6dbdd20aSAndroid Build Coastguard Workeradb devices -l
87*6dbdd20aSAndroid Build Coastguard Worker```
88*6dbdd20aSAndroid Build Coastguard Worker
89*6dbdd20aSAndroid Build Coastguard WorkerIf more than one device or emulator is reported you must select one upfront as
90*6dbdd20aSAndroid Build Coastguard Workerfollows:
91*6dbdd20aSAndroid Build Coastguard Worker
92*6dbdd20aSAndroid Build Coastguard Worker```bash
93*6dbdd20aSAndroid Build Coastguard Workerset ANDROID_SERIAL=SER123456
94*6dbdd20aSAndroid Build Coastguard Worker```
95*6dbdd20aSAndroid Build Coastguard Worker
96*6dbdd20aSAndroid Build Coastguard WorkerDownload the
97*6dbdd20aSAndroid Build Coastguard Worker[`cpu_profile`](https://raw.githubusercontent.com/google/perfetto/main/tools/cpu_profile)
98*6dbdd20aSAndroid Build Coastguard Workerscript. Then, start profiling. For example, to profile the processes
99*6dbdd20aSAndroid Build Coastguard Worker`com.android.foo` and `com.android.bar`, use:
100*6dbdd20aSAndroid Build Coastguard Worker
101*6dbdd20aSAndroid Build Coastguard Worker```bash
102*6dbdd20aSAndroid Build Coastguard Workerpython3 /path/to/cpu_profile -n "com.android.foo,com.android.bar"
103*6dbdd20aSAndroid Build Coastguard Worker```
104*6dbdd20aSAndroid Build Coastguard Worker
105*6dbdd20aSAndroid Build Coastguard WorkerPlease see the [Linux or maxOS section](#linux-or-macos) for more examples.
106*6dbdd20aSAndroid Build Coastguard Worker
107*6dbdd20aSAndroid Build Coastguard Worker## Symbolization
108*6dbdd20aSAndroid Build Coastguard Worker
109*6dbdd20aSAndroid Build Coastguard WorkerYou may need to symbolize the collected profiles if they are missing symbols.
110*6dbdd20aSAndroid Build Coastguard WorkerSee [this](/docs/data-sources/native-heap-profiler#symbolize-your-profile) for
111*6dbdd20aSAndroid Build Coastguard Workermore details on how to do this.
112*6dbdd20aSAndroid Build Coastguard Worker
113*6dbdd20aSAndroid Build Coastguard WorkerFor example, to profile and symbolize the profiles for the process
114*6dbdd20aSAndroid Build Coastguard Worker`com.android.foo`, run:
115*6dbdd20aSAndroid Build Coastguard Worker
116*6dbdd20aSAndroid Build Coastguard Worker```bash
117*6dbdd20aSAndroid Build Coastguard WorkerPERFETTO_SYMBOLIZER_MODE=index PERFETTO_BINARY_PATH=path/to/directory/with/symbols/ ./cpu_profile -n "com.android.foo"
118*6dbdd20aSAndroid Build Coastguard Worker```
119*6dbdd20aSAndroid Build Coastguard Worker
120*6dbdd20aSAndroid Build Coastguard Worker## View profile
121*6dbdd20aSAndroid Build Coastguard Worker
122*6dbdd20aSAndroid Build Coastguard WorkerUpload the `raw-trace` or `symbolized-trace` file from the output directory to
123*6dbdd20aSAndroid Build Coastguard Workerthe [Perfetto UI](https://ui.perfetto.dev) and click and drag over one or more
124*6dbdd20aSAndroid Build Coastguard Workerof the diamond markers in the UI track named "Perf Samples" for the processes
125*6dbdd20aSAndroid Build Coastguard Workerthat you selected for profiling. Each diamond marker represents a snapshot of
126*6dbdd20aSAndroid Build Coastguard Workerthe call-stack at that point on the timeline.
127*6dbdd20aSAndroid Build Coastguard Worker
128*6dbdd20aSAndroid Build Coastguard Worker![Profile Diamond](/docs/images/cpu-profile-diamond.png)
129*6dbdd20aSAndroid Build Coastguard Worker![Native Flamegraph](/docs/images/cpu-profile-flame.png)
130*6dbdd20aSAndroid Build Coastguard Worker
131*6dbdd20aSAndroid Build Coastguard Worker`cpu_profile` will also write separate profiles for each process that it
132*6dbdd20aSAndroid Build Coastguard Workerprofiled in the output directory, and those can be visualized using
133*6dbdd20aSAndroid Build Coastguard Worker[`pprof`](https://github.com/google/pprof). You can merge them into one by
134*6dbdd20aSAndroid Build Coastguard Workerpassing all of them to pprof, e.g.
135*6dbdd20aSAndroid Build Coastguard Worker`pprof /tmp/perf_profile-240105114948clvad/*`.
136