xref: /aosp_15_r20/external/perfetto/src/profiling/memory/README.md (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker# heapprofd - Android Heap Profiler
2*6dbdd20aSAndroid Build Coastguard Worker
3*6dbdd20aSAndroid Build Coastguard Workerheapprofd allows you to attribute memory usage to functions for Android services
4*6dbdd20aSAndroid Build Coastguard Workerand apps.
5*6dbdd20aSAndroid Build Coastguard Worker
6*6dbdd20aSAndroid Build Coastguard WorkerFor documentation, see https://perfetto.dev/docs/data-sources/native-heap-profiler.
7*6dbdd20aSAndroid Build Coastguard Worker
8*6dbdd20aSAndroid Build Coastguard WorkerFor design doc, see https://perfetto.dev/docs/design-docs/heapprofd-design.
9*6dbdd20aSAndroid Build Coastguard Worker
10*6dbdd20aSAndroid Build Coastguard Worker## GN Targets
11*6dbdd20aSAndroid Build Coastguard Worker### Factories
12*6dbdd20aSAndroid Build Coastguard Workerandroid: connects to the system heapprofd. The client API will need to have
13*6dbdd20aSAndroid Build Coastguard Worker         been built at *exactly* the same version. This means this can only
14*6dbdd20aSAndroid Build Coastguard Worker         be used by the API shipped in the platform.
15*6dbdd20aSAndroid Build Coastguard Worker
16*6dbdd20aSAndroid Build Coastguard Workerstandalone: executes an in-process heapprofd. Can be used on old platform
17*6dbdd20aSAndroid Build Coastguard Worker            versions.
18*6dbdd20aSAndroid Build Coastguard Worker
19*6dbdd20aSAndroid Build Coastguard Workernoop: ignores all calls to the client API. This can be used as a stand-in when
20*6dbdd20aSAndroid Build Coastguard Worker      compiling, or when executing without profiling.
21*6dbdd20aSAndroid Build Coastguard Worker
22*6dbdd20aSAndroid Build Coastguard Worker### Interceptors
23*6dbdd20aSAndroid Build Coastguard Workerbionic: uses bionic [malloc dispatch](
24*6dbdd20aSAndroid Build Coastguard Workerhttps://cs.android.com/android/platform/superproject/main/+/main:bionic/libc/private/bionic_malloc_dispatch.h)
25*6dbdd20aSAndroid Build Coastguard Workerto intercept allocation functions on Android. This works by placing a library
26*6dbdd20aSAndroid Build Coastguard Workeron a pre-defined path, which gets [loaded by Bionic](
27*6dbdd20aSAndroid Build Coastguard Workerhttps://cs.android.com/android/platform/superproject/main/+/main:bionic/libc/bionic/malloc_heapprofd.cpp).
28*6dbdd20aSAndroid Build Coastguard Worker
29*6dbdd20aSAndroid Build Coastguard Workerglibc: generates a library exposing the allocation functions. This library
30*6dbdd20aSAndroid Build Coastguard Worker       should be used for `LD_PRELOAD` and uses the glibc specific symbols
31*6dbdd20aSAndroid Build Coastguard Worker       like `__libc_malloc` to use the system allocator.
32*6dbdd20aSAndroid Build Coastguard Worker
33*6dbdd20aSAndroid Build Coastguard Worker### Shared libraries
34*6dbdd20aSAndroid Build Coastguard Worker
35*6dbdd20aSAndroid Build Coastguard Worker| GN target                   | factory    | interceptor | distribution |
36*6dbdd20aSAndroid Build Coastguard Worker|-----------------------------|------------|-------------|--------------|
37*6dbdd20aSAndroid Build Coastguard Worker| heapprofd_client            | android    | bionic      | platform     |
38*6dbdd20aSAndroid Build Coastguard Worker| heapprofd_client_api        | android    | none        | platform     |
39*6dbdd20aSAndroid Build Coastguard Worker| heapprofd_glibc_preload     | standalone | glibc       | unbundled    |
40*6dbdd20aSAndroid Build Coastguard Worker| heapprofd_standalone_client | standalone | none        | unbundled    |
41*6dbdd20aSAndroid Build Coastguard Worker| heapprofd_api_noop          | noop       | none        | unbundled    |
42*6dbdd20aSAndroid Build Coastguard Worker
43*6dbdd20aSAndroid Build Coastguard Worker
44*6dbdd20aSAndroid Build Coastguard Worker## Heap profile heapprofd
45*6dbdd20aSAndroid Build Coastguard Worker
46*6dbdd20aSAndroid Build Coastguard WorkerFor development, you might want to get a heap profile of heapprofd while it
47*6dbdd20aSAndroid Build Coastguard Workeris profiling something else. For that reason, we allow two heapprofds to run
48*6dbdd20aSAndroid Build Coastguard Workeron the system. The secondary heapprofd can then profile your primary one.
49*6dbdd20aSAndroid Build Coastguard Worker
50*6dbdd20aSAndroid Build Coastguard WorkerTo do this, first make sure that heapprofd is running by setting the property
51*6dbdd20aSAndroid Build Coastguard Worker
52*6dbdd20aSAndroid Build Coastguard Worker```
53*6dbdd20aSAndroid Build Coastguard Workeradb shell su root setprop persist.heapprofd.enable 1
54*6dbdd20aSAndroid Build Coastguard Worker```
55*6dbdd20aSAndroid Build Coastguard Worker
56*6dbdd20aSAndroid Build Coastguard WorkerTake note of its PID.
57*6dbdd20aSAndroid Build Coastguard Worker
58*6dbdd20aSAndroid Build Coastguard Worker```
59*6dbdd20aSAndroid Build Coastguard Workeradb shell ps -e | grep heapprofd
60*6dbdd20aSAndroid Build Coastguard Worker```
61*6dbdd20aSAndroid Build Coastguard Worker
62*6dbdd20aSAndroid Build Coastguard WorkerThen, move away the primary heapprofd socket to make space for the secondary
63*6dbdd20aSAndroid Build Coastguard Workerone
64*6dbdd20aSAndroid Build Coastguard Worker
65*6dbdd20aSAndroid Build Coastguard Worker```
66*6dbdd20aSAndroid Build Coastguard Workeradb shell su root mv /dev/socket/heapprofd /dev/socket/heapprofd_primary
67*6dbdd20aSAndroid Build Coastguard Worker```
68*6dbdd20aSAndroid Build Coastguard Worker
69*6dbdd20aSAndroid Build Coastguard WorkerStart the secondary heapprofd
70*6dbdd20aSAndroid Build Coastguard Worker
71*6dbdd20aSAndroid Build Coastguard Worker```
72*6dbdd20aSAndroid Build Coastguard Workeradb shell su root start heapprofd_secondary
73*6dbdd20aSAndroid Build Coastguard Worker```
74*6dbdd20aSAndroid Build Coastguard Worker
75*6dbdd20aSAndroid Build Coastguard WorkerNow we can start the profile of the primary heapprofd (using the secondary).
76*6dbdd20aSAndroid Build Coastguard WorkerLeave this session running.
77*6dbdd20aSAndroid Build Coastguard Worker
78*6dbdd20aSAndroid Build Coastguard Worker```
79*6dbdd20aSAndroid Build Coastguard Workertools/heap_profile -p ${PID_FROM_ABOVE}
80*6dbdd20aSAndroid Build Coastguard Worker```
81*6dbdd20aSAndroid Build Coastguard Worker
82*6dbdd20aSAndroid Build Coastguard WorkerNow move back the original socket
83*6dbdd20aSAndroid Build Coastguard Worker
84*6dbdd20aSAndroid Build Coastguard Worker```
85*6dbdd20aSAndroid Build Coastguard Workeradb shell su root unlink /dev/socket/heapprofd
86*6dbdd20aSAndroid Build Coastguard Workeradb shell su root mv /dev/socket/heapprofd_primary /dev/socket/heapprofd
87*6dbdd20aSAndroid Build Coastguard Worker```
88*6dbdd20aSAndroid Build Coastguard Worker
89*6dbdd20aSAndroid Build Coastguard WorkerNow all subsequent profiles will be done on the primary heapprofd again, with
90*6dbdd20aSAndroid Build Coastguard Workerthe secondary observing it.
91