xref: /aosp_15_r20/external/perfetto/docs/instrumentation/heapprofd-api.md (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker# heapprofd Custom Allocator API - Early Access
2*6dbdd20aSAndroid Build Coastguard Worker
3*6dbdd20aSAndroid Build Coastguard WorkerWARNING: The heapprofd Custom Allocator API is currently in **beta** stage.
4*6dbdd20aSAndroid Build Coastguard Worker         Please file [bugs](https://github.com/google/perfetto/issues/new)
5*6dbdd20aSAndroid Build Coastguard Worker         for any issues you encounter.
6*6dbdd20aSAndroid Build Coastguard Worker
7*6dbdd20aSAndroid Build Coastguard WorkerNOTE: The heapprofd Custom Allocator API requires a device running Android
8*6dbdd20aSAndroid Build Coastguard Worker      10 or newer.
9*6dbdd20aSAndroid Build Coastguard Worker
10*6dbdd20aSAndroid Build Coastguard Worker## Get SDK
11*6dbdd20aSAndroid Build Coastguard Worker
12*6dbdd20aSAndroid Build Coastguard WorkerBefore instrumenting your app, you need to get the heapprofd library and
13*6dbdd20aSAndroid Build Coastguard Workerheader.
14*6dbdd20aSAndroid Build Coastguard Worker
15*6dbdd20aSAndroid Build Coastguard Worker### Option 1: Prebuilts
16*6dbdd20aSAndroid Build Coastguard Worker
17*6dbdd20aSAndroid Build Coastguard WorkerYou can download the library as a binary from [Google Drive](
18*6dbdd20aSAndroid Build Coastguard Workerhttps://drive.google.com/drive/folders/15RPlGgAHWRSk7KquBqlQ7fsCaXnNaa6r
19*6dbdd20aSAndroid Build Coastguard Worker).
20*6dbdd20aSAndroid Build Coastguard WorkerJoin our [Google Group](https://groups.google.com/forum/#!forum/perfetto-dev)
21*6dbdd20aSAndroid Build Coastguard Workerto get access.
22*6dbdd20aSAndroid Build Coastguard Worker
23*6dbdd20aSAndroid Build Coastguard Worker### Option 2: Build yourself (on Linux)
24*6dbdd20aSAndroid Build Coastguard Worker
25*6dbdd20aSAndroid Build Coastguard WorkerAlternatively, you can build the binaries yourself from AOSP.
26*6dbdd20aSAndroid Build Coastguard Worker
27*6dbdd20aSAndroid Build Coastguard WorkerFirst, [check out Perfetto](https://perfetto.dev/docs/contributing/build-instructions):
28*6dbdd20aSAndroid Build Coastguard Worker
29*6dbdd20aSAndroid Build Coastguard Worker```
30*6dbdd20aSAndroid Build Coastguard Worker$ git clone https://android.googlesource.com/platform/external/perfetto/
31*6dbdd20aSAndroid Build Coastguard Worker```
32*6dbdd20aSAndroid Build Coastguard Worker
33*6dbdd20aSAndroid Build Coastguard WorkerThen, change to the project directory, download and build additional
34*6dbdd20aSAndroid Build Coastguard Workerdependencies, and then build the standalone library:
35*6dbdd20aSAndroid Build Coastguard Worker
36*6dbdd20aSAndroid Build Coastguard Worker```
37*6dbdd20aSAndroid Build Coastguard Worker$ cd perfetto
38*6dbdd20aSAndroid Build Coastguard Workerperfetto/ $ tools/install-build-deps --android
39*6dbdd20aSAndroid Build Coastguard Workerperfetto/ $ tools/setup_all_configs.py --android
40*6dbdd20aSAndroid Build Coastguard Workerperfetto/ $ ninja -C out/android_release_incl_heapprofd_arm64 \
41*6dbdd20aSAndroid Build Coastguard Workerlibheapprofd_standalone_client.so
42*6dbdd20aSAndroid Build Coastguard Worker```
43*6dbdd20aSAndroid Build Coastguard Worker
44*6dbdd20aSAndroid Build Coastguard WorkerYou will find the built library in
45*6dbdd20aSAndroid Build Coastguard Worker`out/android_release_incl_heapprofd_arm64/libheapprofd_standalone_client.so`.
46*6dbdd20aSAndroid Build Coastguard WorkerThe header for the API can be found in
47*6dbdd20aSAndroid Build Coastguard Worker`src/profiling/memory/include/perfetto/heap_profile.h`. This library is built
48*6dbdd20aSAndroid Build Coastguard Workeragainst SDK version 29, so will work on Android 10 or newer.
49*6dbdd20aSAndroid Build Coastguard Worker
50*6dbdd20aSAndroid Build Coastguard WorkerWARNING: Only use the header from the checkout you used to build the library,
51*6dbdd20aSAndroid Build Coastguard Worker         as the API is not stable yet.
52*6dbdd20aSAndroid Build Coastguard Worker
53*6dbdd20aSAndroid Build Coastguard WorkerTo make debugging in the future easier, make note of the revision at the time
54*6dbdd20aSAndroid Build Coastguard Workeryou built.
55*6dbdd20aSAndroid Build Coastguard Worker
56*6dbdd20aSAndroid Build Coastguard Worker```
57*6dbdd20aSAndroid Build Coastguard Workergit rev-parse HEAD > perfetto-version.txt
58*6dbdd20aSAndroid Build Coastguard Worker```
59*6dbdd20aSAndroid Build Coastguard WorkerPlease include this in any bugs you file.
60*6dbdd20aSAndroid Build Coastguard Worker
61*6dbdd20aSAndroid Build Coastguard Worker## Instrument App
62*6dbdd20aSAndroid Build Coastguard Worker
63*6dbdd20aSAndroid Build Coastguard WorkerLet's assume your application has a very simple custom allocator that looks
64*6dbdd20aSAndroid Build Coastguard Workerlike this:
65*6dbdd20aSAndroid Build Coastguard Worker
66*6dbdd20aSAndroid Build Coastguard Worker```
67*6dbdd20aSAndroid Build Coastguard Workervoid* my_malloc(size_t size) {
68*6dbdd20aSAndroid Build Coastguard Worker  void* ptr = [code to somehow allocate get size bytes];
69*6dbdd20aSAndroid Build Coastguard Worker  return ptr;
70*6dbdd20aSAndroid Build Coastguard Worker}
71*6dbdd20aSAndroid Build Coastguard Worker
72*6dbdd20aSAndroid Build Coastguard Workervoid my_free(void* ptr) {
73*6dbdd20aSAndroid Build Coastguard Worker  [code to somehow free ptr]
74*6dbdd20aSAndroid Build Coastguard Worker}
75*6dbdd20aSAndroid Build Coastguard Worker```
76*6dbdd20aSAndroid Build Coastguard Worker
77*6dbdd20aSAndroid Build Coastguard WorkerTo find out where in a program these two functions get called, we instrument
78*6dbdd20aSAndroid Build Coastguard Workerthe allocator using this API:
79*6dbdd20aSAndroid Build Coastguard Worker
80*6dbdd20aSAndroid Build Coastguard Worker```
81*6dbdd20aSAndroid Build Coastguard Worker#include "path/to/heap_profile.h"
82*6dbdd20aSAndroid Build Coastguard Worker
83*6dbdd20aSAndroid Build Coastguard Workerstatic uint32_t g_heap_id = AHeapProfile_registerHeap(
84*6dbdd20aSAndroid Build Coastguard Worker  AHeapInfo_create("invalid.example"));
85*6dbdd20aSAndroid Build Coastguard Workervoid* my_malloc(size_t size) {
86*6dbdd20aSAndroid Build Coastguard Worker  void* ptr = [code to somehow allocate get size bytes];
87*6dbdd20aSAndroid Build Coastguard Worker  AHeapProfile_reportAllocation(g_heap_id, static_cast<uintptr_t>(ptr), size);
88*6dbdd20aSAndroid Build Coastguard Worker  return ptr;
89*6dbdd20aSAndroid Build Coastguard Worker}
90*6dbdd20aSAndroid Build Coastguard Worker
91*6dbdd20aSAndroid Build Coastguard Workervoid my_free(void* ptr) {
92*6dbdd20aSAndroid Build Coastguard Worker  AHeapProfile_reportFree(g_heap_id, static_cast<uintptr_t>(ptr));
93*6dbdd20aSAndroid Build Coastguard Worker  [code to somehow free ptr]
94*6dbdd20aSAndroid Build Coastguard Worker}
95*6dbdd20aSAndroid Build Coastguard Worker```
96*6dbdd20aSAndroid Build Coastguard Worker
97*6dbdd20aSAndroid Build Coastguard WorkerDon't forget to link `heapprofd_standalone_client.so` and including it in
98*6dbdd20aSAndroid Build Coastguard Workeryour app.
99*6dbdd20aSAndroid Build Coastguard Worker
100*6dbdd20aSAndroid Build Coastguard Worker## Profile your App
101*6dbdd20aSAndroid Build Coastguard Worker
102*6dbdd20aSAndroid Build Coastguard WorkerThen, use the [heap_profile](
103*6dbdd20aSAndroid Build Coastguard Workerhttps://raw.githubusercontent.com/google/perfetto/main/tools/heap_profile)
104*6dbdd20aSAndroid Build Coastguard Workerscript to get a profile to generate textpb of the config.
105*6dbdd20aSAndroid Build Coastguard WorkerTo convert to a binary proto, you additionally need to download
106*6dbdd20aSAndroid Build Coastguard Worker[`perfetto_trace.proto`](
107*6dbdd20aSAndroid Build Coastguard Workerhttps://raw.githubusercontent.com/google/perfetto/main/protos/perfetto/trace/perfetto_trace.proto)
108*6dbdd20aSAndroid Build Coastguard Workerand have recent version of the protoc compiler installed.
109*6dbdd20aSAndroid Build Coastguard Worker[Learn how to install protoc](https://grpc.io/docs/protoc-installation).
110*6dbdd20aSAndroid Build Coastguard Worker
111*6dbdd20aSAndroid Build Coastguard WorkerOn Linux, you can start a profile using the following pipeline (substitue
112*6dbdd20aSAndroid Build Coastguard Worker`$APP_NAME` for the name of your app and `$HEAP` for the name of the heap
113*6dbdd20aSAndroid Build Coastguard Workeryou registered using `AHeapProfile_registerHeap`):
114*6dbdd20aSAndroid Build Coastguard Worker
115*6dbdd20aSAndroid Build Coastguard Worker```
116*6dbdd20aSAndroid Build Coastguard Workerheap_profile -n $APP_NAME --heaps $HEAP --print-config | \
117*6dbdd20aSAndroid Build Coastguard Worker path/to/protoc --encode=perfetto.protos.TraceConfig perfetto_trace.proto | \
118*6dbdd20aSAndroid Build Coastguard Worker adb shell perfetto -c - -o /data/misc/perfetto-traces/profile
119*6dbdd20aSAndroid Build Coastguard Worker```
120*6dbdd20aSAndroid Build Coastguard Worker
121*6dbdd20aSAndroid Build Coastguard WorkerOn Windows, you will need [python 3.6](https://www.python.org/downloads/) or
122*6dbdd20aSAndroid Build Coastguard Workerlater. You can start a profile using the following pipeline from a command
123*6dbdd20aSAndroid Build Coastguard Workerprompt (substitue`%APP_NAME%` for the name of your app and `%HEAP%` for
124*6dbdd20aSAndroid Build Coastguard Workerthe name of the heap you registered using `AHeapProfile_registerHeap`):
125*6dbdd20aSAndroid Build Coastguard Worker
126*6dbdd20aSAndroid Build Coastguard Worker```
127*6dbdd20aSAndroid Build Coastguard Workerpython /path/to/heap_profile -n %APP_NAME% --heaps %HEAP% --print-config | ^
128*6dbdd20aSAndroid Build Coastguard Worker path/to/protoc --encode=perfetto.protos.TraceConfig perfetto_trace.proto | ^
129*6dbdd20aSAndroid Build Coastguard Worker adb shell perfetto -c - -o /data/misc/perfetto-traces/profile
130*6dbdd20aSAndroid Build Coastguard Worker```
131*6dbdd20aSAndroid Build Coastguard Worker
132*6dbdd20aSAndroid Build Coastguard WorkerPlay around with the app to make it cause custom allocations, then stop the
133*6dbdd20aSAndroid Build Coastguard Workerprofile using `adb shell killall perfetto`. Once it is done, pull the profile
134*6dbdd20aSAndroid Build Coastguard Workerfrom `/data/misc/perfetto-traces/profile` using `adb pull`.
135*6dbdd20aSAndroid Build Coastguard Worker
136*6dbdd20aSAndroid Build Coastguard WorkerUpload the profile to the [Perfetto UI](https://ui.perfetto.dev).
137