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