This is a port of gperftools to the Fuchsia OS

An example of usage of the library is at garnet/examples/profiler

To try things out:

# Run the test app on the target device ...
fx shell run profiler_example

# Retrieve over the profiler trace
fx cp --to-host /tmp/profiler_example.ppf /tmp/profiler_example.ppf

# Install the modern go based version of pprof.
go get -u github.com/google/pprof

# Things to add to your .profile

# Where does the Go pprof execute reside?
export GO_HOME=${HOME}/go/bin/

# Where does pprof search for shared libraries and executables? (macos version, need to adjust for Linux)
export PPROF_BINARY_PATH=\
${FUCHSIA_DIR}/out/x64/exe.unstripped:\
${FUCHSIA_DIR}/out/x64/x64-shared/lib.unstripped:\
${FUCHSIA_DIR}/buildtools/mac-x64/clang/lib/clang/8.0.0/x86_64-fuchsia/lib:\
${FUCHSIA_DIR}/out/x64/sdk/exported/zircon_sysroot/arch/x64/sysroot/debug

# Where is the tool chain? (macos version, need to adjust for Linux)
export PPROF_TOOLS=\
${FUCHSIA_DIR}/buildtools/mac-x64/clang/bin

# It is easier to execute pprof from within ${FUCHSIA_DIR}/out/x64 (or whatever appropriate to your case)
cd ${FUCHSIA_DIR}/out/x64

# Execute pprof to extract the distributions and to collate and symbolize the data.
${GO_HOME}/pprof -text -lines -nodecount 35 -compact_labels -source_path ${FUCHSIA_DIR} -trim_path ../../ exe.unstripped/profiler_example_bin /tmp/profiler_example.ppf
Showing nodes accounting for 67.56s, 86.67% of 77.95s total
Dropped 256 nodes (cum <= 0.39s)
Showing top 35 nodes out of 57
      flat  flat%   sum%        cum   cum%
    21.20s 27.20% 27.20%     21.20s 27.20%  Trie::Map::store garnet/examples/profiler/trie.h:135 (partial-inline)
    18.40s 23.60% 50.80%     18.40s 23.60%  Trie::Map::retrieve garnet/examples/profiler/trie.h:149 (inline)
     6.05s  7.76% 58.56%      6.05s  7.76%  std::__2::basic_string::__is_long buildtools/mac-x64/clang/lib/clang/8.0.0/include/c++/v1/string:1413 (inline)
     2.32s  2.98% 61.54%      2.32s  2.98%  radix_map_performance_print garnet/examples/profiler/words.cc:157
     2.08s  2.67% 64.21%      2.08s  2.67%  memcmp zircon/third_party/ulib/musl/src/string/memcmp.c:5
     1.49s  1.91% 66.12%      1.49s  1.91%  check_if_magic garnet/examples/profiler/magic_numbers.cc
     1.15s  1.48% 67.59%      1.20s  1.54%  Trie::Map::store garnet/examples/profiler/trie.h:131 (partial-inline)
     1.13s  1.45% 69.04%      1.13s  1.45%  Trie::Map::store garnet/examples/profiler/trie.h
     1.09s  1.40% 70.44%      1.14s  1.46%  Trie::Map::retrieve garnet/examples/profiler/trie.h:145 (inline)
     1.04s  1.33% 71.78%      1.04s  1.33%  Trie::Map::retrieve garnet/examples/profiler/trie.h:147 (inline)
     0.91s  1.17% 72.94%      6.69s  8.58%  std::__2::basic_string::__get_pointer buildtools/mac-x64/clang/lib/clang/8.0.0/include/c++/v1/string:1507 (inline)
     0.88s  1.13% 74.07%      0.88s  1.13%  memcmp zircon/third_party/ulib/musl/src/string/memcmp.c:7
     0.86s  1.10% 75.18%      0.86s  1.10%  Trie::Map::retrieve garnet/examples/profiler/trie.h:148 (inline)
     0.75s  0.96% 76.14%      0.75s  0.96%  std::__2::basic_string::compare buildtools/mac-x64/clang/lib/clang/8.0.0/include/c++/v1/string:3653 (inline)
     0.66s  0.85% 76.99%      0.66s  0.85%  generate_or_check garnet/examples/profiler/magic_numbers.cc:84
     0.65s  0.83% 77.82%      0.97s  1.24%  std::__2::__hash_table::__emplace_unique_key_args buildtools/mac-x64/clang/lib/clang/8.0.0/include/c++/v1/__hash_table:2132
     0.63s  0.81% 78.63%      0.63s  0.81%  check_if_magic garnet/examples/profiler/magic_numbers.cc:49
     0.63s  0.81% 79.44%      0.63s  0.81%  std::__2::__hash_table::__emplace_unique_key_args buildtools/mac-x64/clang/lib/clang/8.0.0/include/c++/v1/__hash_table:2131
     0.61s  0.78% 80.22%      0.61s  0.78%  atomic_store /b/s/w/ir/kitchen-workdir/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_atomic_clang_x86.h:82 (inline)
     0.57s  0.73% 80.95%      0.57s  0.73%  Trie::Set::store garnet/examples/profiler/trie.h:70
     0.54s  0.69% 81.64%      4.72s  6.06%  Trie::Map::store garnet/examples/profiler/trie.h:133 (partial-inline)
     0.52s  0.67% 82.31%      0.52s  0.67%  std::__2::char_traits::compare buildtools/mac-x64/clang/lib/clang/8.0.0/include/c++/v1/__string:249 (inline)
     0.50s  0.64% 82.95%      0.50s  0.64%  generate_or_check garnet/examples/profiler/magic_numbers.cc:82
     0.50s  0.64% 83.59%      0.50s  0.64%  std::__2::__constrain_hash buildtools/mac-x64/clang/lib/clang/8.0.0/include/c++/v1/__hash_table:128 (inline)
     0.50s  0.64% 84.23%      0.50s  0.64%  std::__2::__hash_table::__emplace_unique_key_args buildtools/mac-x64/clang/lib/clang/8.0.0/include/c++/v1/__hash_table
     0.48s  0.62% 84.85%      0.48s  0.62%  Trie::Map::store garnet/examples/profiler/trie.h:140 (inline)
     0.48s  0.62% 85.47%      0.48s  0.62%  Trie::Map::~Map garnet/examples/profiler/trie.h:125
     0.44s  0.56% 86.03%      0.44s  0.56%  std::__2::__tree::__find_equal buildtools/mac-x64/clang/lib/clang/8.0.0/include/c++/v1/__tree:2060 (inline)
     0.24s  0.31% 86.34%      2.81s  3.60%  std::__2::__tree::__find_equal buildtools/mac-x64/clang/lib/clang/8.0.0/include/c++/v1/__tree:2048 (inline)
     0.20s  0.26% 86.59%      0.92s  1.18%  check_if_magic garnet/examples/profiler/magic_numbers.cc:48
     0.05s 0.064% 86.66%      0.49s  0.63%  Trie::Set::store garnet/examples/profiler/trie.h:68
     0.01s 0.013% 86.67%      7.87s 10.10%  radix_map_performance_print garnet/examples/profiler/words.cc:147
         0     0% 86.67%      0.49s  0.63%  __scudo::Allocator::allocate /b/s/w/ir/kitchen-workdir/llvm-project/compiler-rt/lib/scudo/scudo_allocator.cpp:377
         0     0% 86.67%     77.95s   100%  async_loop_dispatch_task zircon/system/ulib/async-loop/loop.c:398 (inline)
         0     0% 86.67%     77.95s   100%  async_loop_dispatch_tasks zircon/system/ulib/async-loop/loop.c:378

#Or for a more fun browser-based interactive version of the above:
${GO_HOME}/pprof -http=:8080 -source_path ${FUCHSIA_DIR} -trim_path ../../ exe.unstripped/profiler_example_bin /tmp/profiler_example.ppf
