| Various tools for low level profing of code running on the Dart VM. |
| |
| # Uprobe based profiling |
| |
| [uprobes](https://www.kernel.org/doc/html/latest/trace/uprobetracer.html) 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](https://man7.org/linux/man-pages/man2/perf_event_open.2.html) |
| 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: |
| |
| ```console |
| $ 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: |
| |
| ```console |
| $ 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`: |
| |
| ```console |
| $ pkg/vm/tool/precompiler2 --generate-probe-points test.dart test.aot |
| ``` |
| |
| Then install uprobe on `AllocationProbePoint`: |
| |
| ```console |
| $ 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 |
| ``` |