tree: 5eab4d13bd21b6f408b60a44e5caf30fe39f8f1a [path history] [tgz]
  1. shared_ring_buffer_fuzzer_corpus/
  2. bookkeeping.cc
  3. bookkeeping.h
  4. bookkeeping_unittest.cc
  5. BUILD.gn
  6. client.cc
  7. client.h
  8. client_unittest.cc
  9. heapprofd_end_to_end_test.cc
  10. heapprofd_producer.cc
  11. heapprofd_producer.h
  12. heapprofd_producer_unittest.cc
  13. interner.h
  14. interner_unittest.cc
  15. main.cc
  16. malloc_hooks.cc
  17. proc_utils.cc
  18. proc_utils.h
  19. proc_utils_unittest.cc
  20. README.md
  21. sampler.h
  22. sampler_unittest.cc
  23. scoped_spinlock.cc
  24. scoped_spinlock.h
  25. shared_ring_buffer.cc
  26. shared_ring_buffer.h
  27. shared_ring_buffer_fuzzer.cc
  28. shared_ring_buffer_unittest.cc
  29. system_property.cc
  30. system_property.h
  31. system_property_unittest.cc
  32. unwinding.cc
  33. unwinding.h
  34. unwinding_fuzzer.cc
  35. unwinding_unittest.cc
  36. unwound_messages.h
  37. wire_protocol.cc
  38. wire_protocol.h
  39. wire_protocol_unittest.cc
src/profiling/memory/README.md

heapprofd - Android Heap Profiler

Googlers, for design doc see: http://go/heapprofd-design

heapprofd requires Android Q.

Using convenience script

Use the tools/heap_profile script to heap profile a process. If you are having trouble make sure you are using the latest version.

See all the arguments using tools/heap_profile -h, or use the defaults and just profile a process (e.g. system_server):

tools/heap_profile --name system_server

This will create a heap dump when Ctrl+C is pressed.

The resulting profile proto contains four views on the data

  • space: how many bytes were allocated but not freed at this callstack the moment the dump was created.
  • alloc_space: how many bytes were allocated (including ones freed at the moment of the dump) at this callstack
  • objects: how many allocations without matching frees were done at this callstack.
  • alloc_objects: how many allocations (including ones with matching frees) were done at this callstack.

Googlers: Head to http://pprof/ and upload the gzipped protos to get a visualization.

Speedscope can also be used to visualize the heap dump, but will only show the space view.

Manual

To start profiling the process ${PID}, run the following sequence of commands. Adjust the INTERVAL to trade-off runtime impact for higher accuracy of the results. If INTERVAL=1, every allocation is sampled for maximum accuracy. Otherwise, a sample is taken every INTERVAL bytes on average.

INTERVAL=128000

adb shell su root setenforce 0
adb shell su root start heapprofd

echo '
buffers {
  size_kb: 100024
}

data_sources {
  config {
    name: "android.heapprofd"
    target_buffer: 0
    heapprofd_config {
      sampling_interval_bytes: '${INTERVAL}'
      pid: '${PID}'
      continuous_dump_config {
        dump_phase_ms: 10000
        dump_interval_ms: 1000
      }
    }
  }
}

duration_ms: 20000
' | adb shell perfetto --txt -c - -o /data/misc/perfetto-traces/trace

adb pull /data/misc/perfetto-traces/trace /tmp/trace

While we work on UI support, you can convert the trace into pprof compatible heap dumps. To do so, run

prodaccess
/google/bin/users/fmayer/third_party/perfetto:trace_to_text_sig/trace_to_text \
profile /tmp/trace

This will create a directory in /tmp/ containing the heap dumps. Run

gzip /tmp/heap_profile-XXXXXX/*.pb

to get gzipped protos, which tools handling pprof profile protos expect. Head to http://pprof/ and upload the gzipped protos to get a visualization.