Files
sdk/runtime/tools/profiling
Lasse R.H. Nielsen a824ee3206 Include or remove stray pubspec.yaml files.
There were `pubspec.yaml` files in `tools/` that were not
included in the global package config.
That means that their imports were irrelevant, which could
be misleading. And if any tool would look at the
`pubspec.yaml` file, it might be inconsistent with
the actual package resolution.

Makes every `pubspec.yaml` file either be included by the
`tools/generate_package_config.dart` script, or deletes them
if they seem to be stale and unused.
(Compare vs. `git ls-files '**/pubspec.yaml'`.)

Excepted `tools/dart2js/sourceMapViewer/pubspec.yaml`.
The entire directory might be stale. The dependencies of
that pubspec are not SDK dependencies otherwise,
the pubspec has no SDK min-version, which is now a requirement,
and the README refers to a *packages directory*.
Keeping as-is and filing issue to have owners take a look.

Added `lib/` directory to `tools/` to avoid `tools/bots/`
being inside the package URI root of the `tools/` package,
which would cause its `../../pkg/...` import to fail.

Makes every `pubspec.yaml` file use a `^...` SDK constraint instead
of the longer `>= ... < ...` format.

Tested: No new tests, goal is to keep running the same way
Change-Id: I688e463fe985fc4de43550a1f4c7ff350536cffc
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/414020
Commit-Queue: Lasse Nielsen <lrn@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Reviewed-by: Sigurd Meldgaard <sigurdm@google.com>
Reviewed-by: Brian Quinlan <bquinlan@google.com>
2025-03-31 08:30:33 -07:00
..

Various tools for low level profing of code running on the Dart VM.

Uprobe based profiling

uprobes is a user-space dynamic tracing mechanism. Using this mechanism the kernel can be instructed to place a tracepoint at a particular file offset within a specific binary. Whenever this tracepoint is hit the kernel will fetch values from the execution context based on the uprobe's description and emit an event. A developer can subscribe to uprobe events in a few different ways including perf_event_open syscall. uprobes have been enabled by default on all newish Linux kernels (4.14+), however they are only truly usable on Android/ARM64 starting from 5.10+. bin/set_uprobe.dart is a helper script for placing uprobes inside binaries and using this for profiling.

The core workflow looks like this:

$ sudo $(which dart) runtime/tools/profiling/bin/set_uprobe.dart probeName symbol binary

This will create an uprobe with name probeName which triggers whenever the given symbol inside the given binary is called. You can then record an event (and collect the call stack) using:

$ sudo perf record -g -e uprobes:probeName ...

Allocation profiling with uprobes

AOT compiler can emit a special probe point (stub AllocationProbePoint) which triggers for each new space allocation from generated code. set_uprobe script has special support for this probe point: it will configure probe point to record additional information (address of allocated object, allocation top and cid of the allocated object) allowing to post process collected data into an actual allocation profile.

Start by compiling your application with --generate-probe-points:

$ pkg/vm/tool/precompiler2 --generate-probe-points test.dart test.aot

Then install uprobe on AllocationProbePoint:

$ sudo $(which dart) runtime/tools/profiling/bin/set_uprobe.dart alloc AllocationProbePoint test.aot

Record the profile:

$ sudo perf record -g -e uprobes:alloc out/ReleaseX64/dartaotruntime test.aot
$ sudo chmod 0755 perf.data

Produce a coalesced allocation profile from the recording:

$ dart runtime/tools/profiling/bin/convert_allocation_profile.dart perf.data
$ pprof -flame pprof.profile