Ftrace: Refactor the public interface

The new flow is as follows:

The caller creates:
 FtraceController (does all the initialization)
 FtraceConfig (tells us which events they are interested in)
 FtraceSink::Delegate (implements the client callbacks)

Then they use FtraceController#CreateSink with the FtraceConfig
and Delegate to create a FtraceSink. While the FtraceSink lives
we know to listen and parse the events in config. We turn the
config into an EventFilter and stash it on the FtraceSink
(the EventFilter allows for efficient testing of whether an
event is enabled).

Next they call FtraceController#Start to tell us to start
watching the raw pipe fds.

When we see data at one of those pipes we call
Delgate#GetBundleForCpu to get a protozero object we can write
into. We pass this object and the EventFilter to the CpuReader.
The CpuReader grabs pages from the pipe, parses them, then uses
the EventFilter to write only the enabled events into the
protozero object. After the write we call Delgate#OnBundleComplete
so the client can do any needed bookkeeping.

Finally after some time the client can call FtraceController#Stop
at which point we stop listening for data at the pipes.

Other small changes:
1) Move FtraceCpuReader to src/ (since it is no longer public).
2) Various name shuffling:
FtraceToProtoTranslationTable -> ProtoTranslationTable
FtraceCpuReader -> CpuReader
3) Moving all methods dealing with paths/reading/writing debugfs
into their own class: FtraceApi.

Change-Id: I1fcb725096d2dd5d094ebd2cc5d44691e7b6cca2
18 files changed
tree: 83fd2eb0bd8aed8885e09fab8512d981963ee4a2
  1. base/
  2. build/
  3. buildtools/
  4. ftrace_reader/
  5. infra/
  6. ipc/
  7. protos/
  8. protozero/
  9. tools/
  10. tracing/
  11. .clang-format
  12. .gitignore
  13. .gn
  14. .travis.yml
  15. BUILD.gn
  16. codereview.settings
  17. MODULE_LICENSE_APACHE2
  18. NOTICE
  19. OWNERS
  20. PRESUBMIT.py
  21. README.md
README.md

Perfetto - Performance instrumentation and logging for POSIX platforms

This project is meant to be built both as part of the Android tree and from a standalone checkout

For internal docs see this page

Supported platforms

Android is the platform targeted in the first milestones. Right now Linux desktop and OSX are maintained best-effort.

Get the code

Prerequisites

All dependent libraries are self-hosted and pulled by the build/install-build-deps script.
The only requirements on the host are python, git and a compiler (preferably clang, gcc is maintained best-effort):
$ sudo apt-get update && sudo apt-get install git clang python

Then:
$ git clone https://android.googlesource.com/platform/external/perfetto.git

Contributing

This project uses Android AOSP Gerrit for code reviews and uses the Google C++ style. Currently targets -std=c++11.

You can use both git cl upload from Chromium depot tools or Android repo to upload patches.

git cl is quite convenient as it supports code auto-formatting via git cl format.

See https://source.android.com/source/contributing for more details about external contributions and CLA signing.

Build instructions

Build from a standalone checkout

If you are a chromium developer and have depot_tools installed you can avoid the build/ prefix below and just use gn/ninja from depot_tools.

$ build/install-build-deps to install third-party build deps (NDK etc)

$ build/gn args out/android to generate build files and enter in the editor:

target_os = "android"          # Leave empty for local testing
target_cpu = "arm" or "arm64"  # Only when building for Android

(See the Build Configurations section below for more)

$ build/ninja -C out/android all

Build from the Android tree

TODO. The plan is to autogenerate the Android.bp build files from the master GN build files (or temporarily maintain both until we can autogenerate them).

Run tests

On the host (Linux / OSX)

$ build/ninja -C out/default (tracing_unittests | tracing_benchmarks)
$ out/default/tracing_unittests --gtest_help

On Android

Either connect a device in ADB mode or use the bundled emulator.

To start the emulator:
$ build/run_android_emulator (arm | arm64) &

To run the tests (either on the emulator or physical device):
$ build/run_android_test out/default tracing_unittests

Build configurations

The following GN args are supported:

target_os = "android" | "linux" | "mac":
Defaults to the current host, set "android" to build for Android.

target_cpu = "arm" | "arm64" | "x86" | "x64":
Defaults to "arm" when target_os == "android", "x64" when targeting the host. 32-bit host builds are not supported.

is_debug = true | false:
Toggles Debug (default) / Release mode.

is_clang = true | false:
Use Clang (default) / GCC. It requires clang 3.5+ to be installed on the host. Clang is the default compiler on Mac (% having installed Xcode). On Linux: sudo apt-get update && sudo apt-get install clang

cc = "gcc" / cxx = "g++":
Uses a different compiler binary (default: autodetected depending on is_clang).

is_asan = true:
Enables Address Sanitizer

is_lsan = true:
Enables Leak Sanitizer
(Linux/Mac only)

is_msan = true:
Enables Memory Sanitizer
(Linux only)

is_tsan = true:
Enables Thread Sanitizer
(Linux/Mac only)

is_ubsan = true:
Enables Undefined Behavior Sanitizer