Skip to content

Releases: google/perfetto

Perfetto v52.0

16 Sep 15:41

Choose a tag to compare

We’re excited to share some highlights from the Perfetto v52 release.

🌙 Dark mode support

The Perfetto UI now features a dark mode with theme-aware colors!

image

Dark mode can be enabled via"settings" in the left-hand menu: switch the “[Experimental] UI Theme” option to “Dark”.

Note: this feature is still undergoing polish so is marked as experimental. Please file bugs for any readability/accessibility issues you may encounter!

🎛️ Advanced TrackEvent control & visualization

SDK users and developers converting external traces to Perfetto format now have fine-grained control over track display and merging behavior. The new sibling_merge_behavior and sibling_merge_key options in TrackDescriptor allow you to:

  • Force tracks with the same name to be displayed separately
  • Merge tracks with different names into a single UI track
  • Override the default name-based merging logic

Additionally, counter tracks can now share Y-axis ranges using the y_axis_share_key in CounterDescriptor, making it easier to compare related metrics with the same units.

Learn more about converting custom data to Perfetto format and more advanced conversion features.

🤖 UI automation: macros & startup commands

Perfetto UI now supports two new features to improve developer productivity:

  • Startup commands to automatically configure the analysis environment when traces load
  • Macros to add commands built out of other UI commands to the Command Palette

Both features can be found in the UI settings page:

image

Learn more about UI startup commands and macros and configuring startup commands via URL parameters.

📊 Easily turn kernel trace points into slices and counters

Perfetto now automatically creates structured track visualizations for Linux kernel ftrace events that follow established naming conventions. This feature enables kernel developers to instrument their code with ftrace tracepoints and see them as slices and counters in the Perfetto UI without modifying Perfetto's source code.

image

Learn more about creating kernel track events with ftrace.

⚡ Trace processor performance & new features

  • Faster trace loading: Optimized data structures and MurmurHash implementation result in faster trace loading and query execution
  • New analysis tools: The slice_self_dur table provides self-duration calculations, while the regexp_extract function allows parsing data out of strings without complex use of INSTR/SUBSTR
  • Expanded format support: Added symbolization for kernel frames in Linux perf.data files and support for trace-cmd report output format

📱 Enhanced Android analysis capabilities

  • Better ANR debugging: The anr_type column in the android_anrs table provides more detailed ANR classification
  • Bitmap tracking: New android.bitmaps module offers timeseries information about bitmap usage
  • CPU performance insights: Enhanced CPU utilization functions with upid/utid parameters and improved frequency calculations

🎨 General UI improvements & performance

  • Bulk track management: Configure multiple tracks simultaneously, saving time when setting up complex analysis views
  • Improved plugin architecture: Better isolation and standardized command naming
  • Enhanced visualization: Better DataGrid implementation with improved aggregation performance
  • Track guidance: New help infrastructure and descriptive text support for better user onboarding
  • Optimized track merging: Faster performance when working with large numbers of track_event tracks

📊 Recording & data source improvements

  • Enhanced recording UI: Improved recording page with dedicated Perfetto SDK section for configuring track_event data source categories and wildcards
  • Advanced ftrace features: Support for exclusive single-tenant features, tracing_cpumask, tracefs options, and TID-based filtering
  • GPU monitoring: New support for polling Adreno GPU frequency data

🔧 Additional improvements

  • Fixed numerous crashes and performance issues throughout the UI
  • Improved WebUSB error messages for better debugging experience
  • Enhanced support for persisting state from traces loaded through postMessage

For complete details, see the changelog or view all changes on GitHub.

Download Perfetto v52.0 from our releases page, get started at docs.perfetto.dev, or try the UI directly at ui.perfetto.dev.

Perfetto v51.2

03 Jul 14:47

Choose a tag to compare

v51.2 - 2025-07-03:
  Trace Processor:
    * Fixed issue with trace summarization crashing with released trace
      processor prebuilt. Builds from source with GN and default configuration
      is unaffected.

Perfetto v51.1

30 Jun 12:03

Choose a tag to compare

v51.1 - 2025-06-26:
  Build system:
    * Fixed issue with Bazel copts/cxxopts. Embedders are required to add a
      default_cxxopts to their perfetto.bzl file in their repository.

v51.0 - 2025-06-24:
  Tracing service and probes:
    * Added a new data source to poll for CPU time per UID and cluster.
  SQL Standard library:
    * Added a new standard library table for filtering IRQ slices.
    * Added a new standard library module for Android's Low Memory Killer.
  Trace Processor:
    * Reworked core database engine to be more performant and better architected
      for future imporvements.
    * Added new "trace summarization" functionality to trace processor as a more
      flexible replacement to old metrics system.
    * Added support for executing all available metrics when summarizing the
      trace with `--summary-metrics-v2 all`.
    * Added `trace_summary()` function to the Python API to execute the
      trace summaries and, specifically, v2 metrics.
    * Added support to adding SQL packages to Python API. This is the
      counterpart to the `--add-sql-package` shell option and allow loading SQL
      packages and modules from a filesystem path. These are then available to
      load using `INCLUDE PERFETTO MODULE` PerfettoSQL statements.
    * Improved handling of traces containing overlapping "complete" events
      (i.e. events with a duration, AKA 'X' events in the JSON format).
      While overlapping events are prohibited by the JSON spec, they do
      appear in many synthetically generated JSON traces. Previously, such
      events would break the data model of trace processor and cause signifcant
      glitches in the UI. These events are now dropped, fixing all the visual
      glitches and an error stat is emitted to make the user aware.
    * Improved performance of parsing JSON by 7x. JSON traces should now load
      much faster in the Perfetto UI and the trace processor.
  UI:
    * Improved JSON loading performance. See `Trace Processor` section above.
    * Improved duration based slice aggregators - slices are now trimmed to the
      width of the area selection.
    * Added the ability for users to set a custom timezone in the UI.
    * Added the ability to add descriptive text to tracks.
    * Added touchscreen support. The UI can now be used from tablets and other
      touch devices.
    * Removed the Viz page; it was an experiment which did not go anywhere.
  SDK:
    * Changed the implementation of TrackEvent to only have a single data source
      for multiple namespace; categories will be exported correctly only on
      recent perfetto tracing services that support UpdateDataSource.
    * Changed the priority of TrackEvent enabled/disabled category and tags.
      The new logic ranks (in this order)
      specific > pattern > single char "*" wildcard,
      categories (enabled > disabled) > tags (disabled > enabled).
  Docs:
    * Signifcantly improved the project's documentation with a team-wide
      collaboration to make it more user-friendly and up to date.

Perfetto v50.1

22 Apr 09:02

Choose a tag to compare

v50.1 - 2025-04-17:
  Trace Processor:
    * Fix build on windows


v50.0 - 2025-04-17:
  Tracing service and probes:
    * Removed mm_events support as it is no longer maintained.
  SQL Standard library:
    *
  Trace Processor:
    * Added `thread_or_process_slice` to the `slices.with_context` module for
      a unified table which contains all thread and process slices in the trace.
      This is often useful for ad-hoc queries on Android or Linux traces.
    * Removed `slices.slices` module and `_slice_with_thread_and_process_info`
      view. This is replaced by `thread_or_process_slice` (see above).
    * Fixed io_wait arg name conversion in traceconv.
  UI:
    * Added basic syntax highlighting support to the query page.
    * Retain DOM state between page changes - this fixes a bug where the scroll
      position is lost when switching between pages.
    * Added a plugin-able settings page - a place to put user-facing.
      configuration options which are more complex than a simple boolean. Flags
      should still be used for experimental features and feature flags.
    * Added paging to query results and remove arbitrary 10,000 row limit. This
      fixes a bug where selecting too many slices (e.g. `select * from slice`)
      can tank UI performance.
    * Added options to bulk-copy tracks to a new workspace.
    * Allow workspace tracks to be reordered (drag-n-drop).
    * Render slice hover tooltips to the DOM instead of canvas, which allows
      them to be larger and more customizable.
    * Add subsystem to pass URL args directly to plugins.
    * Added plugin-able track filters, including filter by process and thread.
    * Make android logs selectable, add hover-tooltips, and allow them to be
      selected when iterating search results.
    * Add flag to work around hotkey collisions on dvorak.
    * Fix bug in search where search results could not be iterated through.
    * Fix bug where to "go to next slice" hotkey was not working on AZERTY.
    * Fix bug where created pivoted debug tracks would sometimes be very slow.
    * Fix bug where tracks can get hidden behind sticky headers.
    * Fix crash when marking DNF slices.
    * Fix bug where viewer page didn't scroll back up to the top of the track
      group when a group is collapsed.
    * Small consistency tweaks to styling.
    * Stretch overview timeline to fill screen horizontally to avoid superfluous
      whitespace.
  SDK:
    * Added `TraceWriter::drop_count` function for determining the number of
      of times the writer started dropping data due to exhaustion of the shared
      memory buffer. This can be used by SDK users to diff this value and
      reemit interned data if necessary.

Perfetto v49.0

07 Jan 15:27

Choose a tag to compare

v49.0 - 2025-01-06:
  Tracing service and probes:
    * Add `--clone-by-name` to the perfetto command line. This allows cloning a
      tracing session by its unique_session_name.
    * Fixed a bug that would delay the trace start acknowledgement, resulting
      in a 30s when using --background-wait, if an Android producer process is
      frozen, as it would be considered unresponsive.
    * Added basic support for kprobes with ftrace.
  SQL Standard library:
    * Removed the `type` column from all non-track tables. Please see
      https://perfetto.dev/docs/analysis/perfetto-sql-backcompat#change-in-semantic-of-code-type-code-column-on-track-tables
      for more information.
    * Changed the semantic of `type` column from all track tables. Please see
      https://perfetto.dev/docs/analysis/perfetto-sql-backcompat#removal-of-code-type-code-column-from-all-non-track-tables
      for more information.
    * Removed the `linux_device_track` table. Linux RPM (runtime power
      management) tracks formerly in this table now can be found in the `track`
      table with `type` `linux_rpm`.
    * Removed the `energy_counter_track` table. Android energy estimate
      breakdown tracks formerly in this table now can be found in the `track`
      table with `type` `android_energy_estimation_breakdown`.
    * Removed the `energy_per_uid_counter_track` table. Android energy estimate
      breakdown tracks formerly in this table now can be found in the `track`
      table with `type` `android_energy_estimation_breakdown_per_uid`.
    * Moved the `gpu_work_period_track` table into the `android.gpu.work_period`
      standard library module and renamed it to `android_gpu_work_period_track`.
    * Removed the `irq_counter_track` table. Irq counter tracks formerly in this
      table now can be found in the `track` table with `type`
      `irq_counter`.
    * Removed the `softirq_counter_track` table. Softirq counter tracks formerly
      in this table now can be found in the `track` table with `type`
      `softirq_counter`.
    * Removed the `uid_counter_track` table. It was redundant as no data was
      inserted directly into it.
    * Removed the `uid_track` table. It was redundant as no data was
      inserted directly into it.
    * Removed `common` package. It has been deprecated since `v42` and most
      functionality has been moved into other packages. Notably, the time
      conversion functions can be found in `time.conversion` module, and
      `thread_slice` is available with `slices.with_context`.
    * Deprecated UINT and INT integer types in Perfetto SQL. Please use LONG in
      Perfetto SQL schema.
    * Deprecated FLOAT flating type in Perfetto SQL. Please use DOUBLE in
      Perfetto SQL schema.
    * Added TIMESTAMP, DURATION, ID and JOINID types to Perfetto SQL schema.
      TIMESTAMP and DURATION refers to time columns in nanoseconds. ID column
      is a primary key for the column and JOINID is referencing ID
      column of other table.
    * Removed the `experimental_sched_upid` table. Prefer the joining `sched`
      and `thread` tables directly instead.
    * Removed the experimental_counter_dur table. Prefer using the
      `counter_leading_intervals` macro from the `counters.intervals` standard
      library module.
  UI:
    * Introduced `Open table:` command which would open any Perfetto Standard
      Library table in a new tab.
    * Various improvements to timeline rendering performance.
    * Added workspace switcher and menu to move tracks between workspaces.
    * Completely overhauled recording page.
    * Improved area selection UX.
    * Improved fuzzy search.
    * Hide 'Open with legacy UI' by default.
  SDK:
    * Added `NamedTrack`, it allows creating arbitrarily named tracks.

Perfetto v48.1

15 Oct 10:02

Choose a tag to compare

v48.1 - 2024-10-14:
  SDK:
    * Fix build with MSVC.

Perfetto v48.0

11 Oct 18:06

Choose a tag to compare

v48.0 - 2024-10-11:
  Tracing service and probes:
    * Improved accuracy of ftrace event cropping when there are multiple
      concurrent tracing sessions. See `previous_bundle_end_timestamp` in
      ftrace_event_bundle.proto.
    * Increased watchdog timeout to 180s from 30s to make watchdog crashes
      much less likely when system is under heavy load.
  SQL Standard library:
    * Improved CPU cycles calculation in `linux.cpu.utilization` modules:
     `process`, `system` and `thread` by fixing a bug responsible for too high
      CPU cycles values.
    * Introduces functions responsible for calculating CPU cycles with
      breakdown by CPU, thread, process and slice for a given interval.
    * Added `linux.perf.samples` module for easy querying of perf samples
      in traces.
    * Added `stacks.cpu_profiling` module for easy querying of all CPU
      profiling data in traces.
  Trace Processor:
    * Added (partial) support for the Gecko (Firefox) JSON profiler format.
      Parsing is optimized for CPU profiling collected with `perf` and converted
      to the Gecko format. Only parsing of samples is supported; parsing of
      markers and any other features (e.g. colours) is *not* supported.
    * Added (partial) suppoort for the perf script text format from both perf
      and simpleperf. Only parsing files with the default formating or with pids
      included (i.e. `-F +pid`) is supported. Any other formatting options are
      *not* supported.
    * Added support for parsing non-streaming ART method tracing format.
    * Added support for parsing GZIP files with multiple gzip streams.
    * Added support for parsing V8 CPU profling samples from proto traces.
    * Renamed Trace Processor's C++ method `RegisterSqlModule()` to
     `RegisterSqlPackage()`, which better represents the module/package
      relationship. Package is the top level grouping of modules, which are
      objects being included with `INCLUDE PERFETTO MODULE`.
      `RegisterSqlModule()` is still available and runs `RegisterSqlPackage()`.
      `RegisterSqlModule()` will be deprecated in v50.0.
  UI:
    * Scheduling wakeup information now reflects whether the wakeup came
      from an interrupt context. The per-cpu scheduling tracks now show only
      non-interrupt wakeups, while the per-thread thread state tracks either
      link to an exact waker slice or state that the wakeup is from an
      interrupt. Older traces that are recorded without interrupt context
      information treat all wakeups as non-interrupt.
    * Nest global/user async tracks according to their parent/child relationship
      in the trace.
    * Introduced new workspace API which allows nested tracks & multiple
      workspace support.
    * Introduced middle ellipsis in track titles when title text is longer than
      the available space, while preserving the start and end of title text &
      add popup of full title text on hover.
    * Fixed spurious judder issue in popups with tall content.
    * Fixed bug where marker durations were not rendered on selected markers.
    * Removed ChromeScrollJank V1 track (V2 should be used from now on).
    * Major internal changes (affecting pugin developers and core contributors):
      * Removed legacy selection types, use track event selection types going
        forward for all single event selections.
      * Details panels are now attached to the track rather than registered
        separately.
      * Introduced `registerSqlSelectionResolver`, which allow plugins to add
        handlers allowing other parts of the codebase to make selection on
        tracks from other plugins based on a sql table name and id.
      * Changed lifetime of track instances; they are now created on trace load
        by plugins and survive the lifetime of the trace, rather than getting
        created and destroyed as they appear/disappear on the timeline.
      * Fix circular dependencies and turn future instances into errors.

Perfetto v47.0

07 Aug 17:47

Choose a tag to compare

v47.0 - 2024-08-07:
  SQL Standard library:
    * Removed `cpu.cpus` and `cpu.size` modules. The functions inside
      for guessing core type were inaccurate and often misleading.
      There is no replacement for these as there is no accurate data
      source available.
    * Moved `cpu.utilization` package to `linux.cpu.utilization`. The
      functionality inside this package only works properly on Linux
      and Linux derived OSes (e.g. Android).
    * Moved `cpu.freq` module to `linux.cpu.frequency` and renamed
      `cpu_freq_counters` to `cpu_frequency_counters` for the same
      reason as above.
    * Moved `gpu.frequency` to `android.gpu.frequency` for the same reason as
      above.
    * Moved `cpu.idle` module to `linux.cpu.idle` or `linux.cpu.idle_stats` for
      the same reason as above.
    * Moved content of `linux.cpu_idle` into `linux.cpu.idle` and
      `linux.cpu.idle_stats` to make it consistent with above changes.
    * Moved `memory.android.gpu` to `android.memory.gpu`  to make it consistent
      with above changes.`
    * Moved contents of `memory.linux.process` to `linux.memory.process` and
      `android.memory.process` to make it consistent with above changes.
    * Moved `memory.linux.high_watermark` to `linux.memory.high_watermark` to
      make it consistent with above changes.
    * Moved `memory.heap_graph_dominator_tree` to
      `android.memory.heap_graph.dominator_tree`. This is to allow for the
      addition of more modules related to heap graphs.
    * Added `linux_kernel_threads` table to `linux.threads` module.
  Trace Processor:
    * Change `NotifyEndOfFile` method to return a Status object. For backwards
      compatibility, this value can be ignored but in the future a [[nodiscard]]
      annotation will be added.
    * Added `CREATE PERFETTO INDEX` to add sqlite-like indexes to Perfetto
      tables. Has the same API as `CREATE INDEX`.
  UI:
    * Updated to Typescript 5.5.2, lib es2022, & upreved various packages.
    * Made `Disposable`, `DisposableStack`, and their async variants available
      to use in the UI.
    * Vastly improved flamegraph.
    * Added track filter which can be used to search for tracks by name.
    * Added Wattson cpu power estimation plugin.
    * Added option to show thread slice ancestor/descendant slices in thread
      slice details panel context menu.
    * Added feature where plugin can ask tracks to be automatically pinned when
      adding tracks on trace load.
    * Fixed inconsistent y-range for all CPU SS tracks.
    * Switched to using explicit de/serialization when creating/loading
      permalinks.
    * Improved sched slice details query efficiency.
    * Added `TagInput` widget.
    * Added `ui/format-sources` script to run eslint and prettier in one go.
    * Reduced number of circular imports.
    * Added `SharedAsyncDisposable` for management of shared async resources.
    * Fixed rendering of negative counter tracks.
    * Improved data loss notification using a popup
    * Tidied up `TrackDescriptor`.
    * Added Android trace probes for ChromeOS
    * Added feature to try reconnect when websocket connection is lost.
    * Fixed bug in 1ns event rendering.
    * Tidied up details panel font sizes and weights.
    * Added segmented buttons widget.
    * Added 'main thread' chip to main thread tracks.
    * Added plugin API to add menu items to the sidebar.
    * Added `onTraceReady` plugin hook.
    * Various clean-ups and bugfixes.

Perfetto v46.0

05 Aug 15:58

Choose a tag to compare

Perfetto v46.0 Pre-release
Pre-release
v46.0 - 2024-06-13:
  SQL Standard library:
    * Added megacycles support to CPU package. Added tables:
      `cpu_cycles_per_process`, `cpu_cycles_per_thread` and
      `cpu_cycles_per_cpu`.
    * Improved `memory` package. Added `memory.linux.process`,
      `memory.linux.high_watermark` and `memory.android.gpu` modules.
    * Created `gpu` package with `gpu.frequency` module.
    * Migrated `sched.utilization` package to `cpu.utilization`.
  Trace Processor:
    * Added "time to initial display" and "time to full display" metrics to
      the Android startup metric.
  UI:
    * Added plugin for synchronizing two instances of the UI - search for
      'Enable timeline sync with other Perfetto UI tabs' in the command palette.
    * Add builtin prompt functionality to the plugin API:
      I.e. `await PluginContextTrace.prompt('...')`
    * Fixed various bits of tech debt.
  SDK:
    * The TRACE_COUNTER macro and CounterTrack constructor no longer accept
      `const char *` track names. In case your code fails to compile,
      https://perfetto.dev/docs/instrumentation/track-events#dynamic-event-names
      explains how to fix the problem.

Perfetto v45.0

09 May 18:03

Choose a tag to compare

v45.0 - 2024-05-09:
  Trace Processor:
    * Optimised single column `DISTINCT` queries.
    * Optimised `LIMIT` and `OFFSET` queries.
  SQL Standard library:
    * Improved support for querying startups on Android 9 (API level 28) and
      below. Available in `android.startup.startups` module.
    * Added tables for querying "Time To Initial Display" and "Time To Full
      Display" metrics for app startups. Available in new module
      `android.startup.time_to_display`.
    * Added table for querying hardware power rail counters in new
      `android.power_rails` module.
  UI:
    * Add tracks to the list of searchable items.
    * Use mipmaps to improve track query performance on large traces.
    * Fix slow scrolling bug in ftrace explorer tab on low DPI machines.
    * Overhaul track decider queries to improve trace load times.
    * Add track
    * Tidy up command names & remove some example ones.
    * Remove arg auto-completion in pivot table.
    * Show dominator tree views by default.
    * Fix counter event selection off-by-one error.
    * Add viewport control to the plugin API.
    * Sticky track titles to improve track button accessibility in tall tracks.
    * A handful of small bugfixes.
  SDK:
    * The TRACE_EVENT macro used to reject `const char *` event names: either
      `StaticString` or `DynamicString` needed to be specified. In the last year
      (since https://r.android.com/2494614), TRACE_EVENT mistakenly accepted
      `const char *` as an event name. This has been fixed now. In case your
      code fails to compile,
      https://perfetto.dev/docs/instrumentation/track-events#dynamic-event-names
      explains how to fix the problem.