tree: 1f4eda605dca66d5cc2dbff5c576611e3bea1adf [path history] [tgz]
  1. bookkeeping.cc
  2. bookkeeping.h
  3. bookkeeping_unittest.cc
  4. bounded_queue.h
  5. bounded_queue_unittest.cc
  6. BUILD.gn
  7. client.cc
  8. client.h
  9. client_unittest.cc
  10. heapprofd_integrationtest.cc
  11. heapprofd_producer.cc
  12. heapprofd_producer.h
  13. interner.h
  14. interner_unittest.cc
  15. main.cc
  16. malloc_hooks.cc
  17. process_matcher.cc
  18. process_matcher.h
  19. process_matcher_unittest.cc
  20. queue_messages.h
  21. README.md
  22. record_reader.cc
  23. record_reader.h
  24. record_reader_unittest.cc
  25. sampler.cc
  26. sampler.h
  27. sampler_unittest.cc
  28. socket_listener.cc
  29. socket_listener.h
  30. socket_listener_unittest.cc
  31. system_property.cc
  32. system_property.h
  33. system_property_unittest.cc
  34. unwinding.cc
  35. unwinding.h
  36. unwinding_fuzzer.cc
  37. unwinding_unittest.cc
  38. wire_protocol.cc
  39. wire_protocol.h
  40. wire_protocol_unittest.cc
src/profiling/memory/README.md

heapprofd - Android Heap Profiler

These are temporary instructions while heapprofd is under development. They are subject to frequent change and will be obsoleted once heapprofd is integrated into Perfetto.

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

Using convenience script

Use the tools/heap_profile script to heap profile a process. 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 every second for a default of 1 minute. Head to http://pprof/ and upload the gzipped protos to get a visualization.

Manual

Currently heapprofd only works with SELinux disabled.

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 -t -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.